На этом шаге мы рассмотрим особенности обработки исключений в списках.
Из всех стандартных контейнеров STL списки наиболее надежны в отношении исключений. Практически все операции над
списками либо завершаются успешно, либо не вносят изменений. Такая гарантия не предоставляется только операторами присваивания
и функцией sort() (они дают лишь обычную "базовую гарантию" отсутствия утечки ресурсов и нарушения контейнерных
инвариантов при возникновении исключений). Функции merge(), remove(), remove_if() и unique() предоставляют
гарантии при условии, что исключения не будут сгенерированы при сравнении элементов оператором == или предикатом. Таким
образом, в терминологии программирования баз данных можно сказать, что списки обладают транзакционной безопасностью,
если не использовать операцию присваивании и функцию sort(), а также проследить за тем, чтобы исключения не
генерировались при сравнении. В таблице 1 перечислены все операции, предоставляющие специальные гарантии в отношении
исключений. Обработка исключений в STL более подробно рассматривается на 121 шаге.
Таблица 1. Операции над списками, предоставляющие особые гарантии в отношении исключений
Операция | Описание |
---|---|
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 генерирует исключений |
На следующем шаге мы рассмотрим пример использования списков.