Контейнер типа set
Пары
Парой называется шаблон класса, который хранит пару объектов различного типа. Пара похожа на контейнер в том, что она владеет своими элементами, но она не является контейнером, так как не поддерживает стандартных методов и итераторов, присущих контейнерам. У пары есть два элемента данных (first, second), которые дают возможность манипулировать вложенными объектами. Следующий фрагмент иллюстрирует логику использования пары:
pair<bool, double> result = FindRoot(); if (result.first) print(result.second); else report_error();
Ассоциативные контейнеры используют тип пар _Pairib. Он определяет пару:
pair<iterator, bool>
Первый элемент каждой такой пары является итератором соответствующего типа, а второй – результатом какого-либо действия. Например, метод insert возвращает пару типа _Pairib, анализируя которую вы можете узнать результат вставки (успех или неудача). Рассмотрим пример:
void main ()
{
//========== Массив объектов класса Man
Man ar[] =
{
joy,duke, win, joy,charlie
);
uint size = sizeof (ar) /sizeof (Man);
//========== Создаем множество объектов класса Man
set<Man> s (ar, ar+size); pr(s, "Set of Man");
//========== Ищем объект и удаляем его
set<Man>::iterator p = s.find(joy);
if (p!= s.end())
{
s.erase(p);
cout << "\n\n"<< joy <<" found and erased";
}
pr(s,"After erasure");
//========== Объявляем пару
set<Man>::_Pairib pib;
//========== Пробуем вставить объект
pib = s.insert(joy);
//========== Анализируем результат вставки
cout << "\n\nlnserting: " << *pib.first << "\nResult is: " << pib.second;
//========== Пробуем вставить повторно
pib = s.insert(joy);
cout << "\n\nlnserting: " << *pib.first << "\nResult is: " << pib.second;
//========== Сравниваем ключи
cout << "\n\ns.key_comp() (zoran,count) returned "
<< s.key_comp()(zoran,ar[0]);
cout << "\n\ns.key_comp()(count,zoran) returned "
<< s.key_comp()(ar[0],zoran);
cout <<"\n\n";
}
Приведем результат работы этой программы:
Set of Man # Sequence: 1. Joy Amore, Age: 18 2. Winton Kelly, Age: 50 3. Charlie Parker, Age: 60 4. Duke Ellington, Age: 90 Joy Amore, Age: 18 found and erased After erasure # Sequence: 1. Winton Kelly, Age: 50 2. Charlie Parker, Age: 60 3. Duke Ellington, Age: 90 Inserting: Joy Amore, Age: 18 Result is: 1 Inserting: Joy Amore, Age: 18 Result is: 0 s.key_comp()(zoran,count) returned 0 s.key_comp()(count,zoran) returned 1
