Подобно последовательным контейнерам (см. раздел 9.2.2), для доступа к члену класса, например типа map, используется оператор области видимости.
Тип mapped_type определен только для типов карт (unordered_map, unordered_multimap, multimap и map).
11.3.1. Итераторы ассоциативных контейнеров
При обращении к значению итератора возвращается ссылка на значение типа value_type контейнера. В случае карты типом value_type является пара, переменная-член first которой содержит константный ключ, а переменная-член second — значение:
//
auto map_it = word_count.begin();
//
cout << map_it->first; //
cout << " " << map_it->second; //
map_it->first = "new key"; //
++map_it->second; //
value_type карты является pair и что можно изменять ее значение, но не ключ.
Хотя типы наборов определяют типы iterator и const_iterator, оба типа итераторов предоставляют доступ к элементам в наборе только для чтения. Подобно тому, как нельзя изменить ключевую часть элемента карты, ключи в наборе также константны. Итератор набора можно использовать только для чтения, но не для записи значения элемента:
set
set
if (set_it != iset.end()) {
*set_it = 42; //
cout << *set_it << endl; //
}
Типы map и set поддерживают все функции begin() и end() из табл. 9.2. Как обычно, эти функции можно использовать для получения итераторов, позволяющих перебрать контейнер. Например, цикл вывода результатов программы подсчета слов из раздела 11.1 можно переписать следующим образом:
//
auto map_it = word_count.cbegin();
//
while (map_it != word_count.cend()) {
//
//
cout << map_it->first << " occurs "
<< map_it->second << " times" << endl;
++map_it; //
}
Условие цикла while и инкремент итератора в теле цикла такие же как в программах вывода содержимого векторов или строк. Итератор map_it инициализирован позицией первого элемента контейнера word_count. Пока итератор не равен значению, возвращенному функцией end(), возвращается текущий элемент, а затем происходит приращение итератора. Оператор вывода обращается к значению итератора map_it для получения членов пары, оставаясь в остальном тем же, что и в первоначальной программе.
map, multimap, set и multiset они возвращают элементы в порядке возрастания ключа.
Как правило, с ассоциативными контейнерами обобщенные алгоритмы (см. главу 10) не используются. Тот факт, что ключи константны, означает невозможность передачи итераторов ассоциативных контейнеров алгоритмам, которые пишут или переупорядочивают элементы контейнеров. Таким алгоритмам нужна возможность записи в элементы. Элементы всех типов наборов константны, а у всех типов карт константным является первый член пары.