Лекция 10. Итераторы. Аллокаторы. <iterator> <memory> Виртуализация функций
Итераторы — это клей, скрепляющий алгоритмы стандартной библиотеки с их данными. Итераторы можно также назвать механизмом, минимизирующим зависимость алгоритмов от структуры данных, которыми они оперируют. (Б. Страуструп) Итератор — это аналог указателя, в котором реализованы операции косвенного доступа (например, оператор * для разыменования) и перехода к новому элементу (например, оператор ++ для перехода к следующему элементу). Последовательность элементов определяется парой итераторов, задающих полуоткрытый диапазон [begin , end). Здесь итератор begin указывает на первый элемент последовательности, а итератор end — на элемент, следующий за последним элементом последовательности. Никогда не считывайте и не записывайте значение *end. Для пустой последовательности всегда выполняется условие begin == end. Другими словами, для любого итератора р последовательность [р:р) является пустой. Для того чтобы считать последовательность, алгоритм обычно получает пару итераторов [a,b) и перемещается по элементам с помощью оператора ++, пока не достигнет конца. while (a !=b ) { // используйте != ++a; // переходим к следующему элементу } Алгоритмы, выполняющие поиск элемента в последовательности, в случае неудачи обычно возвращают итератор, установленный на конец последовательности. Рассмотрим пример. р = s.find (v. begin () ,v.end() , х) ; // ищем х в последовательности v if (p != v.end() ) { // х найден в итераторе p } else { // х не найден в диапазоне [v.begin(), v.end() ) }