На этом шаге мы приведем сводную таблицу по обработке исключений в контейнерах 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.