c.erase(k) | Удаляет из карты с элемент с ключом k. Возвращает значение типа size_type, указывающее количество удаленных элементов |
c.erase(p) | Удаляет из карты с элемент, обозначенный итератором p. Итератор p должен относиться к фактически существующему элементу карты с, он не может быть равен итератору, возвращаемому функцией c.end(). Возвращает итератор на элемент после позиции p или c.end(), если итератор p обозначает последний элемент контейнера с |
c.erase(b, е) | Удаляет элементы в диапазоне, обозначенном парой итераторов b и е. Возвращает итератор е |
Ассоциативные контейнеры предоставляют дополнительную версию функции erase(), получающую аргумент типа key_type. Эта версия удаляет все элементы, если таковые вообще имеются, с заданным ключом и возвращает количество удаленных элементов. Эту версию можно использовать для удаления определенных слов из контейнера word_count прежде, чем вывести результат:
//
if (word_count.erase(removal_word))
cout << "ok: " << removal_word << " removed\n";
else
cout << "oops: " << removal_word << " not found!\n";
Для контейнеров с уникальными ключами функция erase() всегда возвращает нуль или единицу. Если возвращается значение нуль, значит, удаляемого элемента не было в контейнере.
Для контейнеров с не уникальными ключами функция erase() возвращает количество удаленных элементов и может быть больше единицы:
auto cnt = authors.erase("Barth, John");
Если authors — это контейнер multimap, созданный в разделе 11.3.2, то переменная cnt будет содержать значение 2.
11.3.4. Индексация карт
Контейнеры map и unordered_map предоставляют оператор индексирования и соответствующую функцию at() (см. раздел 9.3.2), представленные в табл. 11.6. Типы контейнеров set не поддерживают индексацию, поскольку в наборе нет никакого "значения", связанного с ключом. Элементы сами являются ключами, поэтому операция "доступа к значению, связанному с ключом", бессмысленна. Нельзя индексировать контейнер multimap или unordered_multimap, поскольку с заданным ключом может быть ассоциировано несколько значений.
Таблица 11.6. Операторы индексирования контейнеров map и unordered_map
c[k] | Возвращает элемент с ключом k; если ключа k нет в контейнере с, добавляется новый элемент, инициализированный значением с ключом k |
c.at(k) | Проверяет наличие элемента с ключом k; если его нет в контейнере с, передает исключение out_of_range (см. раздел 5.6) |
Подобно другим использованным ранее операторам индексирования, оператор индексирования карт получает индекс (т.е. ключ) и возвращает связанное с ним значение. Однако, в отличие от других операторов индексирования, если такого ключа еще нет,
Рассмотрим следующий код:
map
//
//
word_count["Anna"] = 1;
Ниже приведена имеющая место последовательность действий.
• В контейнере word_count происходит поиск элемента с ключом Anna. Элемент не найден.
• В контейнер word_count добавляется новая пара ключ-значение. Ключ (константная строка) содержит текст Anna. Значение инициализируется по умолчанию, в данном случае нулем.
• Вновь созданному элементу присваивается значение 1.
Поскольку оператор индексирования способен вставить элемент, его можно использовать только для карты, которая не является константной.