- •3.8. Упражнения 49
- •Введение
- •1. Базовые элементы
- •1.1. Комментарии
- •1.2. Функция «main»
- •1.3. Идентификаторы и пространства имен
- •1.4. Типы
- •1.5. Переменные
- •1.7. Константы
- •1.6. Преобразование типов
- •1.8. Потоковый ввод – вывод
- •1.9. Операции
- •1.9.1. Арифметические операции
- •1.9.2. Поразрядные операции
- •1.9.3. Условный оператор
- •1.9.4. Операции отношения
- •1.9.5. Логические операции
- •1.10. Стандартные математические функции
- •1.11. Упражнения
- •2. Базовые конструкции
- •2.1 Ветвление
- •2.1.1. Конструкция «if – else»
- •2.1.2. Конструкция «switch»
- •2.2. Циклы
- •2.2.1. Цикл «for»
- •2.2.2. Цикл «while»
- •2.2.3. Цикл «do – while»
- •2.2.4. Операторы циклов
- •2.2.5. Вложенность
- •2.3. Упражнения
- •2.3.1. Ветвления
- •2.3.2. Циклы
- •2.3.3. Вложенность
- •3. Указатели. Массивы. Структуры
- •3.1. Указатели
- •3.2. Массивы
- •3.2.1. Статические массивы
- •3.2.2. Динамические массивы
- •3.4. Ссылки
- •3.5. Структуры
- •3.6. Объединение
- •3.7. Переопределение типов
- •3.8. Упражнения
- •3.8.1. Статические и динамические массивы
- •3.8.2. Многомерные массивы
- •3.8.3. Строки
- •4. Функции
- •4.1. Простые функции
- •4.2. Рекурсия
- •4.3. Указатели и ссылки
- •4.3.1. Передаваемые параметры
- •4.3.2. Возвращаемые значения
- •4.3.3. Ссылки и структуры в функциях
- •4.3.4. Указатели и массивы в функциях
- •4.3.5. Указатели и ссылки на функцию
- •4.4. Шаблоны функций
- •4.5. Упражнения
- •4.5.1. Простые функции
- •4.5.2. Параметры – ссылки и параметры — указатели
- •5. Стандартные классы
- •5.1. Класс «pair»
- •5.2. Класс «complex»
- •5.3. Класс «string»
- •5.4. Контейнеры. Алгоритмы. Итераторы
- •5.5. Класс «vector»
- •5.6. Упражнения
- •5.6.1. Класс «string»
- •5.6.2. Класс «vector»
- •6. Файловый ввод – вывод
- •6.1. Операции
- •6.2. Методы
- •6.3. Флаги
- •6.4. Двоичный режим
- •6.5. Упражнения
- •Ллитература
5.4. Контейнеры. Алгоритмы. Итераторы
В стандартной библиотеке помимо «pair» и «string» присутствуют и другие классы, называемые контейнерами. Они предназначены для хранения определенных структур данных, при этом тип самих данных может быть любым. Наличие таких классов обусловлено неэффективностью применения встроенных средств.
Контейнеры делятся на последовательные, адаптивные и ассоциативные. В последовательных контейнерах элементы расположены в ряд и связаны меж собой позицией. К таким контейнерам относятся:
Вектор – «vector» (динамически изменяемый массив).
Список – «list» (связанный список).
Очередь с двусторонним доступом – «deque» (вставка и выборка как с конца очереди, так и с начала).
Адаптивные контейнеры построены на базе последовательных, предоставляя к ним ограниченный интерфейс.
Очередь – «queue» (работает по принципу FIFO: первый вошел – первый вышел).
Стек – «stack» (работает по принципу LIFO: последний вошел – первый вышел).
Приоритетная очередь – «priority_queue» (элементы достигают выхода в соответствии со своими приоритетами).
В ассоциативные контейнерах элементы не располагаются последовательно, а хранятся в виде дерева. Доступ к ним осуществляется посредством ключей, модифицируемых самими контейнерами автоматически. К таким контейнерам относятся:
Отображение – «map» (состоит из пар ключа и ассоциированного с ним значения).
Мультиотображение – «multimap» (отображение с поддержкой одинаковых элементов).
Множество – «set» (вырожденное отображение, в котором ключам не соответствуют никакие значения).
Мультимножество – «multiset» (множество с поддержкой одинаковых элементов).
Каждый контейнер имеет свои встроенные методы.
Таблица 5.2. Указатели на элементы.
Название |
Описание |
begin() |
Указывает на первый элемент |
end() |
Указывает на последний элемент |
rbegin() |
Указывает на первый элемент в обратном направлении |
rend() |
Указывает на последний элемент в обратном направлении |
Таблица 5.3. Доступ к элементам.
Название |
Описание |
front() |
Первый элемент |
back() |
Последний элемент |
at() |
Элемент с заданным индексом, с проверкой (не для списка) |
[] |
Элемент с заданным индексом, без проверки (не для списка) |
Таблица 5.4. Операции со стеком и очередями.
Название |
Описание |
push_back() |
Добавление в конец |
pop_back() |
Извлечение из конца |
push_front() |
Добавление в начало (только для списков и двусторонних очередей) |
pop_front() |
Извлечение из начала (только для списков и двусторонних очередей) |
Таблица 5.5. Операции со списками.
Название |
Описание |
insert(a, c) |
Вставка элемента a перед элементом в позиции c |
insert(a, b, c) |
Вставка b элементов a перед элементом в позиции c |
erase(a) |
Удаление элемента в позиции a |
clear() |
Очистка вектора |
Таблица 5.6. Ассоциативные операции.
Название |
Описание |
[] |
Элемент с заданным ключом (для контейнеров с уникальным ключом) |
find() |
Элемент с заданным ключом |
lower_bound() |
Поиск первого элемента с указанным ключом |
upper_bound() |
Поиск первого элемента с ключом, больше указанного |
equal_range() |
Поиск lower_bound() и upper_bound() |
key_comp() |
Копирование элемента с указанным ключом |
value_comp() |
Копирование элемента с указанным значением |
Таблица 5.7. Другие операции.
Название |
Описание |
size() |
Количество элементов |
empty() |
Проверка на пустоту |
max_size() |
Максимальный размер контейнера |
resize() |
Установка новой размерности |
capacity() |
Размер выделенной для вектора памяти |
reserve() |
Выделение для вектора памяти |
swap() |
Обмен векторов элементами |
!=, ==, >, <, >=, <=, = |
Операторы сравнения и оператор присвоения |
= |
Копирующее присваивание |
assign(a, b) |
Присвоение вектору a элементов b |
Эффективная работа с разнообразными структурами данных происходит не только посредством простых встроенных в соответствующие классы методов, но и посредством обобщенных «algorithm» и численных «numeric» алгоритмов. Алгоритмы представляют из себя функции, выполняющие определенные действия над элементами контейнера. Они являются независимыми в том смысле, что могут применяться не только к определенным стандартным контейнерам, но и к разработанным пользователем.
Связь между контейнерами и алгоритмами осуществляется посредством итераторов, представляющих из себя указатели на элементы контейнера. Применение к итератору операции разыменования «*» возвратит значение адресуемого элемента. Итераторы могут быть инкрементированы, проходя по всем элементам контейнера.
Следует заметить, что итераторы механизм связывания со стандартными алгоритмами посредством итераторов применимо не только к контейнерам, но и к таким классам как «string».
