- •Объектно-ориентированное программирование:
- •Содержание
- •Новый тип данных – класс
- •1.2. Доступность компонентов класса
- •1.3. Конструктор и деструктор
- •1.4.4. Статические члены класса
- •1.4. Компоненты-данные и компоненты-функции
- •1.4.1. Данные – члены класса
- •1.4.2. Функции – члены класса
- •1.4.3. Константные компоненты-функции
- •Указатели на компоненты класса
- •1.5.1. Указатели на компоненты-данные
- •1.5.2.Указатели на компоненты-функции
- •1.6. Указатель this
- •1.7. Друзья классов
- •7.1. Дружественная функция
- •1.7.2. Дружественный класс
- •1.8. Определение классов и методов классов
- •2. Наследование
- •2.1. Определение производного класса
- •2.2. Конструкторы и деструкторы производных классов
- •2.3. Виртуальные функции
- •2.4. Абстрактные классы
- •2.5. Включение объектов
- •2.6. Включение и наследование
- •2.7. Множественное наследование
- •2.8. Локальные и вложенные классы
- •2.9. Пример программы для Microsoft Visual Studio
- •2.10. Упражнения
- •3. Перегрузка операций
- •3.1. Перегрузка унарных операций
- •3.2. Перегрузка бинарных операций
- •3.4. Перегрузка операции вызова функции
- •3.5. Перегрузка операции присваивания
- •3.6. Перегрузка операции new
- •3.7. Перегрузка операции delete.
- •3.8. Основные правила перегрузки операций
- •3.9. Примеры программ
- •4. Шаблоны функций и классов
- •4.1. Шаблоны функций
- •4.2. Шаблоны классов
- •4.3. Компонентные функции параметризованных классов
- •4.4. Примеры программ.
- •5. Обработка исключительных ситуаций
- •5.2. Получение дополнительной информации об исключении
- •5.3. Определение типа исключения
- •5.4. Иерархия исключений
- •5.5. Спецификация функций, обрабатывающих исключения
- •6. Потоковые классы
- •6.1. Библиотека потоковых классов
- •6.3. Стандартные потоки ввода-вывода
- •6.4. Форматирование
- •6.5. Манипуляторы
- •6.6. Ввод-вывод объектов пользовательских классов
- •6.7. Определение пользовательских манипуляторов
- •6.8. Пользовательские манипуляторы с параметрами
- •6.9. Использование макросов для создания манипуляторов
- •6.10. Состояние потока
- •6.11. Неформатированный ввод-вывод
- •6.12. Файловый ввод-вывод
- •7.1. Пространство имен
- •7.2. Динамическая идентификация типов
- •7.3. Безопасное приведение типа
- •8. Стандартная библиотека шаблонов
- •8.1. Введение в stl
- •Парадигму обобщенного программирования можно сформулировать следующим образом:
- •8.2. Итераторы
- •8.3. Классы-контейнеры
- •Iterator find(const key_type&k)
- •Iterator lower_bound(const key_type&k)
- •Iterator upper_bound(const key_type&k)
- •8.4. Контейнер vector
- •8.5. Многомерные массивы
- •8.6. Ассоциативные контейнеры
- •8.7. Объекты-функции
- •8.8. Алгоритмы
- •I. Немодифицирующие операции
- •II. Модифицирующие операции
- •III. Сортировка
- •IV. Работа с множествами
- •V. Минимумы и максимумы
- •VI. Перестановки
8.2. Итераторы
Итератор–это специальный вспомогательный объект, который поставляется разработчиком контейнерного класса. Единственное назначение такого объекта – обеспечить доступ к элементам контейнера без показа внутренней структуры контейнера (один элемент за одно обращение).
Обычно итератор содержит указатель, с которым производятся различные манипуляции.
В STL итератор – это фундамент, на котором основано использование контейнерных классов и алгоритмов.
Итераторы применяются для различных целей:
Итератор может обозначать конкретное значение.
Пара итераторов может задавать диапазон значений. При этом второе значение (второй итератор) рассматривается не как часть определяемого диапазона, но как запредельный элемент, описывающий значение, следующее за последним значением из заданного диапазона.
Основное действие, которое модифицирует итератор, – это операции инкремент ++ , декремент -- и увеличение +.
Для доступа к данным, определяемым итератором используется оператор разыменования *.
Итератор является шаблоном, параметром которого является контейнерный класс. Существует пять типов итераторов:
Итераторы ввода (input_iterator) поддерживают операции равенства, разыменования и автоинкремента. Итераторы, отвечающие этим условиям, могут использоваться для однопроходных алгоритмов, которые читают значения данных в одном направлении. Специальным случаем итератора ввода является istream_iterator.
==, !=, *i, ++i, i++, *i++.
Итераторы вывода (output_iterator) поддерживают разыменование, допустимое только с левой стороны присваивания, и инкремент:
++i, i++, *i=t, *i++=t
Однонаправленные итераторы (forward_iterator) поддерживают все операции итераторов ввода-вывода и, кроме того, позволяют без ограничений применять присваивание. Для них из i==j следует ++i==++j, что не всегда истинно для итераторов ввода. Т.е. forward-итераторы сохраняют позицию внутри структуры данных (контейнера) при многократных проходах. Таким образом, их можно использовать в алгоритмах с многократным проходом.
==, !=, =, *i, ++i, i++, *i++.
Двунаправленные итераторы (biderectional_iterator) обладают всеми свойствами forward-итераторов, а также возможностью прохода контейнера в обоих направлениях, т.е. имеют дополнительная операции –декремент
--i, i--, *i--.
Итераторы произвольного доступа (random_access_iterator) обладают всеми свойствами двунаправленных итераторов, а также поддерживают операции сравнения и адресной арифметики, т.е. непосредственный доступ по индексу.
i+=n, a+n, i-=n, a-n, i-j, i[n], i<j, i<=j, i>j, i>=j.
Таким образом, с их помощью можно написать такие алгоритмы, как алгоритмы быстрой сортировки, которые требуют эффективного произвольного доступа.
С итераторами можно работать так же, как с указателями. К ним можно применить операции *, инкремента, декремента. Типом итератора объявляется тип iterator, который определен соответствующим образом в различных контейнерах. В STL также поддерживаются обратные итераторы (reverse iterators). Обратными итераторами могут быть либо двунаправленные итераторы, либо итераторы произвольного доступа, но проходящие последовательность в обратном направлении. То есть если обратный итератор указывает на последний элемент последовательности, то инкремент этого итератора приведет к тому, что он будет указывать на предпоследний элемент.
