Программирование. Принципы и практика использования C++ Исправленное издание, стр. 424
class exception {public: exception(); exception(const exception&); exception& operator=(const exception&); virtual ~exception(); virtual const char* what() const;};Функцию
what()Приведенная ниже иерархия стандартных исключений может помочь вам классифицировать исключения.

Можете определить исключение, выведя его из стандартного библиотечного исключения следующим образом:
struct My_error:runtime_error { My_error(int x):interesting_value(x) { } int interesting_value; const char* what() const { return "My_error"; }};Б.3. Итераторы
Итераторы — это клей, скрепляющий алгоритмы стандартной библиотеки с их данными. Итераторы можно также назвать механизмом, минимизирующим зависимость алгоритмов от структуры данных, которыми они оперируют (см. раздел 20.3).

Б.3.1. Модель итераторов
Итератор — это аналог указателя, в котором реализованы операции косвенного доступа (например, оператор
*++[begin:end]
Иначе говоря, итератор
beginend*endbegin==end[p:p]Для того чтобы считать последовательность, алгоритм обычно получает пару итераторов (
b, e++while (b!=e) { // используйте !=, а не < // какие-то операции ++b; // переходим к последнему элементу}Алгоритмы, выполняющие поиск элемента в последовательности, в случае неудачи обычно возвращают итератор, установленный на конец последовательности. Рассмотрим пример.
p = find(v.begin(),v.end(),x); // ищем x в последовательности vif (p!=v.end()) { // x найден в ячейке p}else { // x не найден в диапазоне [v.begin():v.end())}См. раздел 20.3.
Алгоритмы, записывающие элементы последовательности, часто получают только итератор, установленный на ее первый элемент. В данном случае программист должен сам предотвратить выход за пределы этой последовательности. Рассмотрим пример.
template<class Iter> void f(Iter p, int n){ while (n>0) *p++ = ––n; vector<int> v(10); f(v.begin(),v.size()); // OK f(v.begin(),1000); // большая проблемаНекоторые реализации стандартной библиотеки проверяют выход за пределы допустимого диапазона, т.е. генерируют исключение, при последнем вызове функции
f()Перечислим операции над итераторами.

Обратите внимание на то, что не каждый вид итераторов (раздел Б.3.2) поддерживает все операции над итераторами.
Б.3.2. Категории итераторов
В стандартной библиотеке предусмотрены пять видов итераторов.

С логической точки зрения итераторы образуют иерархию (см. раздел 20.10).

Поскольку категории итераторов не являются классами, эту иерархию нельзя считать иерархией классов, реализованной с помощью наследования. Если вам требуется выполнить над итераторами нетривиальное действие, поищите класс
iterator_traitsКаждый контейнер имеет собственные итераторы конкретной категории:
•
vector•
list•
deque•
bitset•
set•
multiset•
map•
multimap•
unordered_set•
unordered_multiset•
unordered_map•
unordered_multimap