- •Объектно-ориентированное программирование:
- •Содержание
- •Новый тип данных – класс
- •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.3. Классы-контейнеры
В STL определены два типа контейнеров – последовательности и ассоциативные контейнеры.
Встроенные массивы, строки string, векторы valarray (векторы, оптимизированные для численных расчетов) и битовые поля bitset содержат элементы и, следовательно, могут считаться контейнерами. Однако эти типы не являются полностью разработанными стандартными контейнерами. Если бы они являлись таковыми, это помешало бы их основному назначению.
Ниже перечислены основные классы-контейнеры с указанием заголовочных файлов, которые необходимо подключить при их использовании.
bitset множество битов <bitset>
deque двусторонняя очередь <deque>
list линейный список <list>
map ассоциативный список для хранения пар ключ/значение, где с каждым ключом связано одно значение <map>
multimap с каждым ключом связано два или более значений <map>
multiset множество, в котором каждый элемент не обязательно уникален <set>
priority_queue очередь с приоритетом <queue>
queue очередь <queue>
set множество <set>
stack стек <stack>
vector динамический массив <vector>
Ключевая идея для стандартных контейнеров заключается в том, что, когда это представляется разумным, они должны быть логически взаимозаменяемыми. Пользователь может выбирать между ними, основываясь на соображениях эффективности и потребности в специализированных операциях. Например, если часто требуется поиск по ключу, можно воспользоваться map (ассоциативным массивом). С другой стороны, если преобладают операции, характерные для списков, можно воспользоваться контейнером list. Если добавление и удаление элементов часто производится в концы контейнера, следует подумать об использовании очереди queue, очереди с двумя концами deque, стека stack. По умолчанию пользователь должен использовать vector; он реализован, чтобы хорошо работать для самого широкого диапазона задач. Кроме того, пользователь может разработать дополнительные контейнеры, вписывающиеся в рамки стандартных контейнеров.
Идея обращения с различными видами контейнеров – и в общем случае со всеми видами источников информации – унифицированным способом ведет к понятию обобщенного программирования, о чем говорилось выше.
Поскольку имена типов элементов, входящих в объявление класса-шаблона, могут быть самыми разными, в классах-контейнерах с помощью ключевого слова typedef объявляются некоторые согласованные версии этих типов. Эта операция позволяет конкретизировать имена типов. Ниже перечислены имена этих типов.
size_type интегральный тип, эквивалентный типу size_t, являющемся беззнаковым целочисленным типом, представляющим результат операции sizeof.
reference тип ссылки на элемент контейнера.
const_reference тип константной ссылки на элемент контейнера
iterator тип итератора
const_iterator тип константного итератора
reverse_iterator тип обратного итератора
const_reverse_iterator тип константного обратного итератора
value_type тип хранящегося в контейнере значения.
allocator_type тип распределителя памяти.
key_type тип ключа в ассоциативных контейнерах
mapped_type тип отображенного значения в ассоциативных контейнерах
key_compare тип функции, которая сравнивает два ключа.
value_compare тип функции, которая сравнивает два значения
Следующие компонентные функции контейнеров используют итераторы в качестве возвращаемого значения:
iterator begin() указывает на первый элемент
iterator end() указывает на элемент, следующий за последним
reverse_iterator begin() указывает на первый элемент в обратной последовательности
reverse_iterator rend() указывает на элемент, следующий за последним в обратной последовательности
Следующие компонентные функции контейнеров используют итераторы в качестве возвращаемого ссылки
reference front() ссылка на первый элемент
reference back() ссылка на последний элемент
reference operator[]() доступ по индексу без проверки
reference at() доступ по индексу с проверкой
Следующие компонентные функции контейнеров включают элементы в контейнер
insert() включает элемент (последовательность элементов) в контейнер
push_back() добавление х в конец
push_front() добавление нового первого элемента (только для списков и очередей с двумя концами)
Следующие компонентные функции контейнров удаляют элелементы из контейнера
pop_back() удаление последнего элемента
pop_front() удаление первого элемента (только для списков и очередей с двумя концами)
erase() удаление заданной последовательности элементов
clear() удаление всех элементов контейнера
Операция доступа к элементу контейнера по индексу
reference operator[](size_type pos);
Операции для ассоциативных контейнеров:
T& operator[](const key_type& k)
доступ к элементу с ключом k
