На этом шаге мы рассмотрим связь отображений и ассоциативных массивов.
Если в примере предыдущего шага заменить multimap на map, программа выведет те же данные без дубликатов (значения могут быть теми же). С другой стороны, набор пар "ключ/значение" с уникальными ключами также можно рассматривать как ассоциативный массив. Рассмотрим следующий пример:
//--------------------------------------------------------------------------- #include <vcl.h> #include <iostream> #include <map> #include <conio.h> //необходимо для getch() #pragma hdrstop //--------------------------------------------------------------------------- #pragma argsused using namespace std; std::string ToRus(const std::string &in) { char *buff = new char [in.length()+1]; CharToOem(in.c_str(),buff); std::string out(buff); delete [] buff; return out; } int main(int argc, char* argv[]) { // Тип контейнера: // - map: элементами являются пары "ключ/значение" // - string: ключи относятся к типу string // - float: значения относятся к типу float typedef map <string,float> StringFloatMap; StringFloatMap coll; // Вставка элементов в коллекции coll["VAT"] = 0.15; coll["Pi"] = 3.1415; coll["an arbitrary number"] = 4983.223; coll["Null"] = 0; // Вывод содержимого коллекции // - перебор всех элементов // - компонент first содержит ключ // - компонент second содержит значение StringFloatMap::iterator pos; for (pos = coll.begin(); pos != coll.end(); ++pos) { cout << "key: \"" << pos->first << "\" " << "value: " << pos->second << endl; } getch(); return 0; } //---------------------------------------------------------------------------
В объявлении типа контейнера должны быть указаны оба типа (ключа и значения):
typedef map<string,float> StringFloatMap;
При работе с отображениями операция вставки может осуществляться оператором индексирования []:
coll["VAT"] = 0.15; coll["Pi"] = 3.1415; coll["an arbitrary number"] = 4983.223; coll["Null"] = 0;
Индекс используется в качестве ключа и может иметь произвольный тип. Такой интерфейс типичен для ассоциативных массивов. Ассоциативным массивом называется массив, индекс которого может относиться к произвольному типу (не обязательно числовому).
Обратите внимание: оператор индексирования в данном случае работает не так, как обычный оператор индексирования массивов. Отсутствие элемента, связанного с индексом, не является ошибкой. При появлении нового индекса (или ключа) создается и вставляется в контейнер новый элемент, ключом которого является указанный индекс. Таким образом, в ассоциативных массивах индекс в принципе не может принимать недопустимое значение. Следовательно, в показанной ниже команде из рассмотренного примера создается новый элемент с ключом "Null":
coll["Null"] = 0;
Оператор присваивания связывает этот ключ со значением 0, преобразованным к типу float.
Оператор индексирования не может использоваться с мультиотображениями. Мультиотображение допускает наличие нескольких элементов с одинаковыми ключами, поэтому оператор индексирования, работающий только с одним значением, в этом случае оказывается бесполезным. Как показывает пример из предыдущего шага, при вставке элементов в мультиотображение необходимо конструировать пары "ключ/значение". Такой способ подходит и для отображений.
При обращении к ключу и значению элемента мультиотображения, как и в случае с отображениями, используются компоненты first и second структуры pair. Результат работы программы выглядит так:
Рис.1. Результат работы приложения
На следующем шаге мы рассмотрим категории итераторов.