Шаг 153.
Библиотека STL.
Контейнеры STL. Операции над списками. Вставка и удаление элементов

    На этом шаге мы рассмотрим особенности использования операций вставки и удаления элементов.

    В таблице 1 перечислены операции вставки и удаления элементов в списках. Списки поддерживают все функции деков, а также специальные реализации алгоритмов remove() и remove_if(). Как это обычно бывает при использовании STL, правильность аргументов обеспечивается вызывающей стороной. Итераторы должны ссылаться на правильные позиции, конец интервала не должен предшествовать началу, элементы не должны удаляться из пустого контейнера.

Таблица 1. Операции вставки и удаления для списков
Операция Описание
c.insert(pos,elem) Вставляет копию elem в позицию итератора pos и возвращает позицию нового элемента
c.insert(pos,n,elem) Вставляет n копий elem в позицию итератора pos (и не возвращает значения)
c.insert(pos,beg,end) Вставляет копию всех элементов интервала [beg,end) в позицию итератора pos (и не возвращает значения)
c.push_back(elem) Присоединяет копию elem в конец списка
c.pop_back() Удаляет последний элемент (не возвращая его)
c.push_front(elem) Вставляет копию elem в начало списка
c.pop_front() Удаляет первый элемент (не возвращая его)
c.remove(val) Удаляет все элементы со значением val
c.remove_if(op) Удаляет все элементы, для которых op(elem) возвращает true
c.erase(pos) Удаляет элемент в позиции итератора pos и возвращает позицию следующего элемента
c.erase(beg,end) Удаляет все элементы из интервала [beg,end) и возвращает позицию следующего элемента
c.resize(num) Приводит контейнер к размеру num (если size() при этом увеличивается, новые элементы создаются своим конструктором по умолчанию)
c.resize(num,elem) Приводит контейнер к размеру num (если size() при этом увеличивается, новые элементы создаются как копии elem)
c.clear() Удаляет все элементы (контейнер остается пустым)

    Вставка и удаление выполняются быстрее, если группа элементов обрабатывается одним вызовом вместо нескольких последовательных вызовов.

    Для удаления элементов в списках предусмотрены специализированные версии алгоритмов remove(). Эти функции работают быстрее алгоритмов remove(), потому что используют вместо элементов только внутренние указатели. Следовательно, в отличие от векторов или деков операцию remove() для списков следует вызывать в форме функции класса, а не алгоритма (смотри шаг 136). Чтобы удалить все элементы с заданным значением, воспользуйтесь следующей конструкцией (за подробностями обращайтесь на 109 шаг):

  std::list<Elem> coll;
  .    .    .   .   .
  // Удаление всех элементов со значением val 
  coll.remove(val);

    Однако для того чтобы удалить только первый экземпляр искомого значения, придется воспользоваться алгоритмом (по аналогии с тем, как показано на шаге 136 для векторов).

    Функция remove_if позволяет определить критерий удаления элементов в виде функции или объекта функции. Она удаляет каждый элемент, для которого передаваемая операция возвращает true. Пример использования remove_if() для удаления всех элементов с четными значениями:

  list.remove_if (notl(bind2nd(modulus<int>(),2)));

    На следующем шаге мы рассмотрим функции врезки.




Предыдущий шаг Содержание Следующий шаг