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

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

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

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

    Что касается эффективности, следует помнить, что вставка и удаление выполняются быстрее, если:

    Вставка и удаление элементов приводят к появлению недействительных ссылок, указателей и итераторов, ссылающихся на элементы после позиции вставки. Если вставка приводит к перераспределению памяти, то недействительными становятся все ссылки, итераторы и указатели. (Естественно, позиция в операциях вставки/удаления задается итератором.)

    Векторы не поддерживают операции прямого удаления элементов с некоторым значением. Для этой цели применяется алгоритм. Например, следующая команда удаляет все элементы со значением val:

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

    Эта конструкция описана на 107 шаге.

    Следующий фрагмент удаляет из вектора только первый элемент с некоторым значением:

  std::vector<Elem> coll;
  // Удаление первого элемента со значением val 
  std::vector<Elem>::iterator pos; 
  pos = find(coll.begin(),coll.end(),
             val);
  if (pos != coll.end()) { 
    coll.erase(pos);
  }

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




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