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