Отображение как ассоциативный массив
Если в предыдущем примере заменить multimap на mар, программа выведет те же данные без дубликатов (значения могут быть теми же). С другой стороны, набор пар «ключ/значение» с уникальными ключами также можно рассматривать как ассоциативный массив. Рассмотрим следующий пример:
#include "stdafx.h"
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main()
{
/* Тип контейнера;
* - 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 << "\t"<< "value: = "<<pos->second << endl;
}
В объявлении типа контейнера должны быть указаны оба тана (ключа и значения):
typedef map<string, float> StringFloatMap;
При работе с отображениями операция вставки может осуществляться оператором индексирования []:
coll ["VAT"] = 0.15;
coll["Pi"] = 3.1415;
coll["an arbitrary number"] = 4983.223;
соll['Null”] = 0;
Индекс используется в качестве ключа и может иметь произвольный тип. Такой интерфейс типичен для ассоциативных массивов. Ассоциативным массивом называется массив, индекс которого может относиться к произвольному типу (не обязательно числовому).
Обратите внимание: оператор индексирования в данном случае работает не так, как обычный оператор индексирования массивов. Отсутствие элемента, связанного с индексом, не является ошибкой. При появлении нового индекса (или ключа) создается и вставляется в контейнер новый элемент, ключом которого является указанный индекс. Таким образом, в ассоциативных массивах индекс в принципе не может принимать недопустимое значение. Следовательно, в команде соll [“Null"] = 0 из рассмотренного примера создается новый элемент с ключом "Null". Оператор присваивания связывает этот ключ со значением 0, преобразованным к типу float.
Оператор индексирования не может использоваться с мультиотображениями. Мультиотображение допускает наличие нескольких элементов с одинаковыми ключами, поэтому оператор индексирования, работающий только с одним значением, в этом случае оказывается бесполезным. Как было показано ранее, при вставке элементов в мультиотображение необходимо конструировать пары «ключ/значение». Такой способ подходит и для отображений.
При обращении к ключу и значению элемента мультиотображения, как и в случае с отображениями, используются компоненты first и second структуры pair. Результат работы программы выглядит так:
key:= "Null” value:= 0
key: “Pi” value:= 3.1415
key: "VAT” value: 0.15
key: ="an arbitrary number" value: =4983.22
Дата добавления: 2020-12-11; просмотров: 353;