|
Программирование >> Немодифицирующие последовательные алгоритмы
int mainO { multiset<int, less<int> > S, T; S.insert(10); S.insert(20); S.insert(30) , S.insert(10); T.insert(20); T.insert(30); T.insert(10); if (S == T) cout Equal multisets:\n ; else cout Unequal multisets:\n ; cout S: ; copy(S.beginO , S.endO, ostream iterator<int>(cout, )); cout endl; cout T: ; copy{T.begin{), T.end{), ostream iterator<int>{cout, )); cout endl; return 0; } Вывод программы показывает, что ключ 10 дважды встречается во множестве с дубликатами S. Поскольку он встречается только один раз в Г, эти два множества с дубликатами неравны: Unequal multisets: S: 10 10 20 30 Т: 10 20 30 2.7. Словари и словари с дубликатами Словари Происхождение термина ассоциативный контейнер становится ясным, как только мы начинаем рассматривать словари. Например, телефонный справочник связывает (ассоциирует) имена с номерами. Имея заданное имя или ключ, мы хотим узнать соответствующий номер. Другими словами, телефонная книга является отображением имен на числа. Если имя Johnson, J. соответствует номеру 12345, STL позволяет нам определить словарь D, так что мы можем записать следующий оператор для выражения отображения, показанного на второй строчке: D[ Johnson, J. ] = 12345; Johnson,]. 12345 Отметим сходство с обычными массивами, например: а[5] = Q; 5 -Q В последнем случае индексами являются значения 0,1,2,но на словари это ограничение не распространяется. Нижеприведенная программа показывает, что словарями удобно пользоваться: mapl.cpp: Первая программа со словарями, ♦include <iostream> ♦include <string> ♦include <map> using namespace std; class compare { public: bool operator{)(const char *s, const char *t)const { return strcmp(s, t) < 0; int main() { map<char*, long, compare> D; D[ Johnson, J. ] = 12345; D[ Smith, P. ] = 54321; D[ Shaw, A. ] = 99999; D[ Atherton, K. ] = mil; char GivenName[30]; cout Enter a name: ; cin.get(GivenName, 30); if (D. find (GivenName) != D.endO) cout The number is D[GivenName]; else cout Not found. ; cout endl; return 0; В отличие от предыдущего примера программа тар.срр содержит определенный нами функциональный объект (функциональные объекты рассмотрены в разделе 1.12). Определение map<char*, long, compare> D; справочника D содержит следующие параметры шаблона: * тип ключа char*; * тип сопутствующих данных long; * класс функционального объекта compare. Функция-член operatorQ класса compare определяет отношение меньше для ключей. Словари с дубликатами Следующая программа показывает, что словари с дубликатами могут содержать повторяющиеся ключи: multimap.срр: Множество с дубликатами, содержащее одинаковые ключи. iinclude <iostream> iinclude <string> iinclude <map> using namespace std; class compare { public: bool operator 0 (const char *s, const char *t)const { return strcmp{s, t) < 0; typedef multimap<char*, long, compare> mmtype; int main{) { mmtype D; D.insert(mmtype::value type{ Johnson, J. , 12345)); D.insert(mmtype::value type{ Smith, P. , 54321)); D.insert(mmtype::value type{ Johnson, J. , 10000)); cout << There are D.sizeO elements.\n ; return 0; Программа выведет: There are 3 elements. Оператор доступа по индексу [] не определен для множеств с дубликатами, поэтому мы не можем добавить элемент, написав, к примеру: D[ Johnson, J. ] = 12345; Вместо этого напишем: D.insert(mmtype::value type{ Johnson, J. , 12345)); где mmtype на самом деле означает multimap<char*, long, compare> Так как идентификатор value type определен внутри шаблонного класса multimap, перед valuejtype здесь требуется написать префикс mmtype::. Определение идентификатора value type основано на шаблоне pair, который мы сейчас и обсудим.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |