Шаг 203.
Библиотека STL. Контейнеры STL. Типы и функции контейнеров. Вставка и удаление элементов (окончание)

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

  void список::remove (const T& value) 
  void список::remove_if (UnaryPredicate op)
Функция remove() удаляет все элементы со значением value. Функция remove_if() удаляет все элементы, для которых унарный предикат ор(элемент) возвращает true. Предикат ор не должен изменять свое состояние во время вызова функции. Обе версии вызывают деструкторы для удаляемых элементов. Порядок остальных элементов сохраняется. Это специализированная версия алгоритма remove(), оптимизированная для списков. Т - тип элементов контейнера. Функции генерируют исключения только при сравнении элементов. Поддерживаются списками.

  size_type контейнер::erase (const T& value)
Удаляет из ассоциативного контейнера все элементы со значением, равным value. Возвращает количество удаленных элементов. Вызывает деструкторы для удаляемых элементов. Т - тип сортируемых данных: Функция не генерирует исключений. Поддерживается множествами, мультимножествами, отображениями, мультиотображениями.

  void контейнер::erase (iterator pos) 
  iterator контейнер::erase (iterator pos)
Обе версии удаляют элемент в позиции итератора pos. Для последовательных контейнеров (векторы, деки, списки и строки) используется вторая сигнатура, которая возвращает позицию следующего элемента (или end()). Для ассоциативных контейнеров (множества, мультимножества, отображения, мультиотображения) используется первая сигнатура, которая не имеет возвращаемого значения. Обе версии вызывают деструкторы для удаляемых элементов. Перед вызовом необходимо убедиться в том, что итератор pos имеет допустимое значение. Пример:
  coll.erase(coll.end()); // ОШИБКА - непредсказуемые последствия
В векторах и деках в результате выполнения операции итераторы и ссылки на другие элементы могут стать недействительными. В векторах и деках функция генерирует исключения только в том случае, если исключение генерируется копирующим конструктором или оператором присваивания. В остальных контейнерах функция не генерирует исключений. Поддерживается векторами, деками, списками, множествами, мультимножествами, отображениями, мультиотображениями, строками.

  void контейнер::erase (iterator beg, iterator end) 
  iterator контейнер::erase (iterator beg, iterator end)
Обе версии удаляют элементы в интервале [beg,end). Для последовательных контейнеров (векторы, деки, списки и строки) используется вторая сигнатура, которая возвращает позицию элемента, находящегося за последним удаленным элементом (или end()). Для ассоциативных контейнеров (множества, мультимножества, отображения, мультиотображения) используется первая сигнатура, которая не имеет возвращаемого значения. Интервал является открытым, то есть удаляются все элементы, включая beg, но исключая end. Обе версии вызывают деструкторы для удаляемых элементов. Перед вызовом необходимо убедиться в том, что итераторы beg и end определяют действительный интервал элементов контейнера. В векторах и деках в результате выполнения операции итераторы и ссылки на другие элементы могут стать недействительными. В векторах и деках функция генерирует исключения только в том случае, если исключение генерируется копирующим конструктором или оператором присваивания. В остальных контейнерах функция не генерирует исключений. Поддерживается векторами, деками, списками, множествами, мультимножествами, отображениями, мультиотображениями, строками.

  void контейнер::pop_front (const T& value) 
Удаляет первый элемент контейнера. Эквивалентно следующему вызову:
  контейнер::erase (контейнер.begin())
Если контейнер не содержит элементов, последствия вызова непредсказуемы. Следовательно, при вызове необходимо убедиться в том, что контейнер содержит по крайней мере один элемент (size()>0). Функция не генерирует исключений. Поддерживается деками и списками.

  void контейнер::pop_back (const T& value)
Удаляет последний элемент. Эквивалентно следующему вызову, но при условии, что это выражение действительно (для векторов выполнение этого условия не гарантировано):
  контейнер.erase(--контейнер.end())
Если контейнер не содержит элементов, последствия вызова непредсказуемы. Следовательно, при вызове необходимо убедиться в том, что контейнер содержит по крайней мере один элемент (size()>0). Функция не генерирует исключений. Поддерживается векторами, деками, списками.

  void контейнер::resize (size_type num)
  void контейнер::resize (size_type num, T value)
Обе версии изменяют количество элементов до num. Если при вызове size()==num, вызов игнорируется. Если при вызове size()<num, дополнительные элементы создаются и присоединяются к концу контейнера. В первой версии новые элементы создаются вызовом конструктора по умолчанию, по второй версии они создаются как копии value. Если при вызове size()>num, элементы в коице контейнера удаляются до заданного размера. В этом случае для удаляемых элементов вызываются деструкторы. В векторах и деках в результате выполнения операции итераторы и ссылки на другие элементы могут стать недействительными. В векторах и деках функция либо выполняется успешно, либо не вносит изменений, если при выполнении копирующего конструктора или оператора присваивания не было сгенерировано исключение. В списках функция либо выполняется успешно, либо не вносит изменений. Поддерживается векторами, деками, списками, строками.

  void контейнер::сlеаr ()
Удаляет все элементы, оставляя контейнер пустым. Вызывает деструкторы для удаляемых элементов. Все итераторы и ссылки на контейнер становятся недействительными. В векторах и деках функция генерирует исключения только в том случае, если исключение генерируется копирующим конструктором или оператором присваивания. В остальных контейнерах функция не генерирует исключений. Поддерживается векторами, деками, списками, множествами, мультимножествами, отображениями, мультиотображениями, строками.

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




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