2.7. Словари и словари с дубликатами
Словари
Происхождение термина «ассоциативный контейнер» становится ясным, как только мы начинаем рассматривать словари. Например, телефонный справочник связывает (ассоциирует) имена с номерами. Имея заданное имя или ключ, мы хотим узнать соответствующий номер. Другими словами, телефонная книга является отображением имен на числа. Если имя Johnson, J. соответствует номеру 12345, STL позволяет нам определить словарь D, так что мы можем записать следующий оператор для выражения отображения, показанного на второй строчке:
D["Johnson, J."] = 12345;
JohnsonJ." -> 12345 Отметим сходство с обычными массивами, например:
а[5] = 'Q';
5 -> "Q"
Словари и словари с дубликатами
63
В последнем случае индексами являются значения 0,1,2,..., но на словари это ограничение не распространяется. Нижеприведенная программа показывает, что словарями удобно пользоваться:
// mapl.cpp: Первая программа со словарями, ttinclude <iostream> ttinclude <string> ttinclude <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."] = 11111;
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.
Функция-член operator^) класса compare определяет отношение меньше для ключей.
Словари с дубликатами
Следующая программа показывает, что словари с дубликатами могут содержать повторяющиеся ключи:
// multimap.срр: Множество с дубликатами,
// содержащее одинаковые ключи.
#include <iostream>
<< назад вперед >>