Контейнер типа 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