На этом шаге мы рассмотрим некоторые операции поиска.
По аналогии с множествами и мультимножествами в отображениях и мультиотображениях определены специальные функции поиска, оптимизированные с учетом внутренней древовидной структуры контейнера (таблица 1).
Операция | Описание |
---|---|
count(key) | Возвращает количество элементов с ключом key |
find(key) | Возвращает позицию первого элемента с ключом key (или end()) |
lower_bound(key) | Возвращает первую позицию, в которой может быть вставлен элемент с ключом key (первый элемент >= key) |
upper_bound(key) | Возвращает последнюю позицию, в которой может быть вставлен элемент с ключом key (первый элемент > key) |
equal_range(key) | Возвращает первую и последнюю позиции, в которых может быть вставлен элемент с ключом key (интервал, в котором элементы равны key) |
Функция find() ищет первый элемент с заданным ключом и возвращает его позицию в виде итератора. Если поиск оказывается безуспешным, функция find() возвращает end(). Функция find() не может использоваться для поиска элемента с заданным значением. Вместо этого приходится задействовать универсальный алгоритм типа find_if() или программировать цикл. Ниже приведен пример простого цикла, выполняющего некоторую операцию для каждого элемента с заданным значением:
std::multimap<std::string,float> coll; // Выполнение операции над всеми элементами с заданным значением std::multimap<std::string,float>::iterator pos; for (pos = coll.begin(); pos != coll.end(); ++pos) { if (pos->second == value) { do_something(); } }
Если цикл используется для удаления элементов, будьте осторожны - по ошибке можно "отпилить ветку, на которой сидишь".
Искать элемент с заданным значением при помощи алгоритма find_if() еще сложнее, чем запрограммировать цикл, поскольку для этого придется создать объект функции, сравнивающий значение элемента с заданным значением. Пример мы рассмотрим позже.
Функции lower_bound(), upper_bound() и equal_range() работают так же, как во множествах (смотри 161 шаг), за исключением того, что позиция определяется по ключу.
На следующем шаге мы рассмотрим присваивание.