Типы и функции контейнеров. Обработка исключений в контейнерах 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.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий