На этом шаге мы рассмотрим удаление элементов.
Чтобы удалить элемент с некоторым значением, достаточно вызвать функцию erase():
std::set<Elem> coll;
. . . .
// Удаление всех элементов с переданным значением
coll.erase(value);
В отличие от списков функция удаления для множеств и мультимножеств называется erase(), а не remove() (см. описание функции remove() на 153 шаге). Она ведет себя иначе и возвращает количество удаленных элементов. Для множеств возвращаются только значения 0 и 1.
Если мультимножество содержит дубликаты, вам не удастся использовать функцию erase() для удаления только первого дубликата. Вместо этого можно воспользоваться следующим фрагментом:
std::multiset<Elem> coll; . . . . . // Удаление первого элемента с переданным значением std::multiset<Elem>::iterator pos; pos = coll.find (elem); if (pos != coll.end()) { coll.erase(pos); }
Вместо алгоритма find() следует использовать функцию класса find(), потому что она работает быстрее.
Обратите внимание: в данном случае также существуют различия в типе возвращаемого значения, а именно: для последовательных и ассоциативных контейнеров функция erase() возвращает разные типы.
iterator erase(iterator pos); iterator erase(iterator beg, iterator end);
void erase(iterator pos); void erase(iterator beg, iterator end);
Такие различия были внесены по соображениям быстродействия. В ассоциативных контейнерах на поиск и возвращение следующего элемента потребовалось бы дополнительное время, поскольку контейнер реализован в виде бинарного дерева. С другой стороны, чтобы программный код работал с любым контейнером, возвращаемое значение приходится игнорировать.
На следующем шаге мы рассмотрим обработку исключений.