На этом шаге мы рассмотрим особенности обработки исключений в списках.
Из всех стандартных контейнеров STL списки наиболее надежны в отношении исключений. Практически все операции над списками либо завершаются успешно, либо не вносят изменений. Такая гарантия не предоставляется только операторами присваивания и функцией sort() (они дают лишь обычную "базовую гарантию" отсутствия утечки ресурсов и нарушения контейнерных инвариантов при возникновении исключений). Функции merge(), remove(), remove_if() и unique() предоставляют гарантии при условии, что исключения не будут сгенерированы при сравнении элементов оператором == или предикатом. Таким образом, в терминологии программирования баз данных можно сказать, что списки обладают транзакционной безопасностью, если не использовать операцию присваивании и функцию sort(), а также проследить за тем, чтобы исключения не генерировались при сравнении. В таблице 1 перечислены все операции, предоставляющие специальные гарантии в отношении исключений. Обработка исключений в STL более подробно рассматривается на 121 шаге.
Операция | Описание |
---|---|
push_back() | Либо завершается успешно, либо не вносит изменений |
push_front() | Либо завершается успешно, либо не вносит изменений |
insert() | Либо завершается успешно, либо не вносит изменений |
pop_back() | He генерирует исключений |
pop_front() | He генерирует исключений |
erase() | He генерирует исключений |
clear() | He генерирует исключений |
resize() | Либо завершается успешно, либо не вносит изменений |
remove() | He генерирует исключений, если они не будут сгенерированы при сравнении элементов |
remove_if() | He генерирует исключений, если они не будут сгенерированы предикатом |
unique() | He генерирует исключений, если они не будут сгенерированы при сравнении элементов |
splice() | He генерирует исключений |
merge() | Либо завершается успешно, либо не вносит изменений (если исключения не будут сгенерированы при сравнении элементов) |
reverse() | He генерирует исключений |
swap() | He генерирует исключений |
На следующем шаге мы рассмотрим пример использования списков.