Функции lower_bound() и upper_bound() неприменимы для неупорядоченных контейнеров. Оператор индексирования и функция at() применимы только для тех контейнеров map и unordered_map, которые не являются константами. | |
|---|---|
c.find(k) | Возвращает итератор на (первый) элемент с ключом k или итератор после конца, если такого элемента нет в контейнере |
c.count(k) | Возвращает количество элементов с ключом k. Для контейнеров с уникальными ключами результат всегда нуль или единица |
c.lower_bound(k) | Возвращает итератор на первый элемент, значение ключа которого не меньше, чем k |
c.upper_bound(k) | Возвращает итератор на первый элемент, значение ключа которого больше, чем k |
c.equal_range(k) | Возвращает пару итераторов, обозначающих элементы с ключом k. Если такового элемента нет, значение обеих переменных-членов равно c.end() |
find() вместо индексирования картДля контейнеров map и unordered_map оператор индексирования представляет простейший способ поиска значения. Но, как уже упоминалось, у оператора индексирование есть серьезный побочный эффект: если искомого ключа еще нет в карте, индексирование добавляет элемент с таким ключом. Насколько правильно такое поведение, зависит от обстоятельств. Программа подсчета слов полагалась на тот факт, что использование несуществующего ключа при индексировании приводило к вставке элемента с этим ключом и значением 0.
Иногда мы хотим знать, присутствует ли элемент с заданным ключом, не изменяя карту. Нельзя использовать оператор индексирования для определения наличия элемента, поскольку при его отсутствии оператор индексирования добавит новый элемент с таким ключом. В таких случаях следует использовать функцию find():
if (word_count.find("foobar") == word_count.end())
cout << "foobar is not in the map" << endl;
multimap и multisetПоиск элемента в ассоциативном контейнере с уникальными ключами довольно прост — элемент либо есть в контейнере, либо нет. Для контейнеров с не уникальными ключами все несколько сложнее, так как может существовать несколько элементов с заданным ключом. Когда в контейнере multimap или multiset содержится несколько элементов с одинаковым ключом, они располагаются в контейнере рядом.
Предположим, например, что, имея карту авторов и их книг, следует вывести все книги некоего автора. Эту задачу можно решить тремя способами. Самый очевидный из них — использовать функции find() и count():
string search_item("Alain de Botton"); //
auto entries = authors.count(search_item); //
auto iter = authors.find(search_item); //
//
//
while (entries) {
cout << iter->second << endl; //
++iter; //
--entries; //
}
Код начинается с вызова функции count(), позволяющего выяснить количество записей для данного автора, и вызова функции find(), позволяющего получить итератор на первый элемент с этим ключом. Количество итераций цикла for зависит от числа, возвращенного функцией count(). В частности, если функция count() возвратит нуль, то цикл не выполнится вообще.
multimap или multiset возвратит все элементы с заданным ключом.