Шаг 207.
Библиотека STL. Контейнеры STL. Типы и функции контейнеров. Обработка исключений в контейнерах STL

    На этом шаге мы приведем сводную таблицу по обработке исключений в контейнерах STL.

    Как упоминалось на 121 шаге, контейнеры предоставляют разный уровень гарантий в отношении исключений. Стандартная библиотека C++ гарантирует отсутствие утечки ресурсов и нарушения контейнерных инвариантов в отношении исключения, однако некоторые операции предоставляют более твердые гарантии (при условии, что аргументы удовлетшряют некоторым условиям): они могут гарантировать транзакционную безопасность (принятие/откат) и даже то, что они никогда не генерируют исключений. В таблице 1 перечислены все операции, для которых предоставляются такие гарантии.

Таблица 1. Контейнерные операции с особыми гарантиями в отношении исключений
Операция Гарантия
vector::push_back() Либо завершается успешно, либо не вносит изменений
vector::insert() Либо завершается успешно, либо не вносит изменений, если при копировании/присваивании элементов не генерируются исключения
vector::pop_back() Не генерирует исключений
vector::erase() Не генерирует исключений, если они не генерируются при копировании/присваивании элементов
vector::clear() Не генерирует исключений, если они не генерируются при копировании/присваивании элементов
vector::swap() Не генерирует исключений
deque::push_back() Либо завершается успешно, либо не вносит изменений
deque::push _front() Либо завершается успешно, либо не вносит изменений
deque::insert() Либо завершается успешно, либо не вносит изменений, если при копировании/присваивании элементов не генерируются исключения
deque::pop_back() Не генерирует исключений
deque::pop_front() Не генерирует исключений
deque::erase() He генерирует исключений, если они не генерируются при копировании/присваивании элементов
deque::clear() Не генерирует исключений, если они не генерируются при копировании/присваивании элементов
deque::swap() Не генерирует исключений
list::push_back() Либо завершается успешно, либо не вносит изменений
list::push_front() Либо завершается успешно, либо не вносит изменений
list::insert() Либо завершается успешно, либо не вносит изменений
list::pop_back() Не генерирует исключений
list::pop_front() Не генерирует исключений
list::erase() Не генерирует исключений
list::clear() Не генерирует исключений
list::remove() Не генерирует исключений, если они не генерируются при сравнении элементов
list::remove_if() Не генерирует исключений, если они не генерируются предикатом
list::unique() Не генерирует исключений, если они не генерируются при сравнении элементов
list::splice() Не генерирует исключений
list::merge() Либо завершается успешно, либо не вносит изменений, если при сравнении элементов не генерируются исключения
list::reverse() Не генерирует исключений
list::swap() Не генерирует исключений
[multi]set::insert() При вставке одного элемента либо завершается успешно, либо не вносит изменений
[multi]set::erase() Не генерирует исключений
[multi]set::clear() Не генерирует исключений
[multi]set::swap() Не генерирует исключений, если они не генерируются при копировании/присваивании критерия сравнения
[multi]map::insert() При вставке одного элемента либо завершается успешно, либо не вносит изменений
[multi]map::erase() Не генерирует исключений
[multi]map::clear() Не генерирует исключений
[multi]map::swap() Не генерирует исключений, если они не генерируются при копировании/присваивании критерия сравнения

    Векторы, деки и списки также предоставляют особые гарантии для resize(). В соответствии с ними последствия от вызова resize() эквивалентны либо вызову erase(), либо вызову insert(), либо отсутствию операции:

void контейнер::resize (size_type nun, T value = Т())
{
  if (num > size()) {
    insert (end(), num-size(), value);
  }
  else 
    if (num < size()) {
      erase (begin()+num, end());
    }
}

    Иначе говоря, предоставляемые гарантии определяются комбинацией гарантий для erase() и insert() (смотри 121 шаг).

    Со следующего шага мы начнем рассматривать итераторы STL.




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