На этом шаге мы приведем сводную таблицу по обработке исключений в контейнерах STL.
Как упоминалось на 121 шаге, контейнеры предоставляют разный уровень гарантий в отношении исключений. Стандартная библиотека C++ гарантирует отсутствие утечки ресурсов и нарушения контейнерных инвариантов в отношении исключения, однако некоторые операции предоставляют более твердые гарантии (при условии, что аргументы удовлетшряют некоторым условиям): они могут гарантировать транзакционную безопасность (принятие/откат) и даже то, что они никогда не генерируют исключений. В таблице 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.