Post on 15-Jun-2015
description
КОНТЕЙНЕРЫ STL
Михаил Кройтор
Содержание
Итераторы Свойства итераторов Контейнеры Общие свойства контейнеров Последовательные контейнеры Ассоциативные контейнеры Использование контейнеров рекомендации
Обозначения
обозначения Х - некторый класс (контейнер); u, a, b - объекты класса X; r - итератор; T - значимый тип (элементов
контейнера); t - значение типа T; n - целочисленное значение.
Итераторы
Итератор - объект, предоставляющий доступ к элементам контейнера и позволяющий их перебирать.
ВИДЫ ИТЕРАТОРОВ
Итератор ввода
Итератор вывода
Последовательный итератор
Итератор произв. доступа
Двунаправленный итератор
Итераторы
Итератор ввода (input iterator) – позволяет получать значения элементов контейнера;
Итератор вывода (output iterator) – позволяет изменять значения элементов контейнера;
Последовательный итератор (forward iterator) – гарантируют последовательный перебор элементов;
Двунаправленный итератор (bidirectional iterator) – позволяют перебирать элементы контейнера как в прямом, так и в обратном порядке;
Итератор произвольного доступа (random access iterator) – ;
Свойства итераторов:итераторы ввода
Свойство Пояснение
X(a)X u(a);X u = a;
Конструктор копирования. Предполагается наличие деструктора
a = b; Оператор копирования.
a==b;a != b;
Операторы сравнения
*a; Оператор разыменования. Возвращается ссылка на объект из контейнера.
++r;r++;
Последовательный перебор итераторов
NB: Итераторы ввода не гарантируют, что если a == b, то a++ == b++
Свойства итераторов:итераторы вывода
Свойство Пояснение
X(a)X u(a);X u = a;
Конструктор копирования. Предполагается наличие деструктора
*a = t; Оператор разыменования. Возвращается ссылка на объект из контейнера.
++r;r++;
Последовательный перебор итераторов
Свойства итераторов:последовательные итераторы
Свойство Пояснение
Обладает всеми свойствами итераторов ввода и вывода
a==b;a != b;
Операторы сравнения.a == b => ++a == ++b
Свойства итераторов:двунаправленные итераторы
Свойство Пояснение
Обладает всеми свойствами последовательных итераторов
--r;r--;
Последовательный перебор итераторов
Свойства итераторов:итераторы произвольного доступа
Свойство Пояснение
Обладает всеми свойствами двунаправленных итераторов
r += n;r –= n;
Сдвиг на n элементов от итератора r
r + n;n + r;r – n;
Сдвиг на n элементов от итератора а
b – a; Расстояние между итераторами
a[n] Последовательный перебор итераторов
a > b;a < b;a ≥ b;a ≤ b;
Операторы упорядочения.
Контейнеры
под контейнером понимают объект, содержащий другие (обычно однотипные) объекты.
Доступ к элементом контейнера осуществляется через итераторы.
Контейнеры С++ представляют собой шаблонные классы с общим базовым интерфейсом.
Конетйнеры
Список (list) Очередь (deque) Вектор (vector)
Множество (set) Хеш-массив
(map) Множество с
повторами (multiset)
Хеш-массив с повторами (multimap)
Последовательные Ассоциативные
Контейнеры: структуравыражение значение
X::value_type Равен типу T
X::reference Равен типу T&
X::iterator тип итератора, указывает на X::reference
X::const_iterator Константный итератор
X() Конструктор по умолчанию
X(a) Конструктор копирования
a.begin() Возвращает Iterator; const_iterator для постоянного a
a.end() Возвращает Iterator; const_iterator для постоянного a
a.size() Возвращает размер контейнера
a.empty() Проверяет, если контейнер пустой
… …
Последовательные контейнеры:общие свойства
выражение значениеX(n, t)X a(n, t);
после: size() == n.создаёт последовательность с n копиями t.
X(i, j)X a(i, j);
после: size() == расстоянию между i и j.создаёт последовательность, равную диапазону [i, j).
a.insert(p, t) вставляет копию t перед p.возвращаемое значение указывает на вставленную копию.
a.insert(p, n, t) вставляет n копий t перед p.
a.insert(p, i, j) вставляет копии элементов из диапазона [i, j) перед p.
a.erase(q) удаляет элемент, указываемый q.
a.erase(ql, q2) удаляет элементы в диапазоне [ql, q2).
Последовательные контейнеры:дополнительные свойства
выражение
семантика контейнер
a.front() *a.begin() vector, list, deque
a.back() *(--a. end()) vector, list, deque
a.push_front(t)
a.insert(a.begin(), t) list, deque
a.push_back(t)
a.insert(a.end(), t) vector, list, deque
a.pop_front() a.erase(a.begin()) list, deque
a.pop_back() a.erase(-- a.end()) vector, list, deque
a[n] *(a.begin() + n) vector, deque
Ассоциативные контейнеры:общие свойства
свойство пояснение
X::key_type Тип ключа
X::value_type Тип значения
X::key_compare
Тип функции сравнения ключей (функтор)
X(i, j), X(i, j, c) Создание контейнера и заполнение его значениями из [i, j). c – объект сравнения
a.insert(t)a.insert(i, j)a.insert(p, t)
Вставка элемента (полуотрезка)
a.erase(k);a.erase(q);
Удаление элемента по ключу или итератору.
a.find(k) Поиск значения по ключу
a.count(k) Подсчет элементов с ключом, равным к
… …
Использование контейнеров
Рекомендации:выбор контейнера
Критерий Рекомендация
Возможность вставки нового элемента на произвольную позицию контейнера
Если нужна, выбирайте последовательный контейнер; ассоциативные контейнеры не подходят.
Структура памяти контейнера должна соответствовать правилам языка C
Только vector
критична скорость поиска Рассмотрите сортированные векторы и ассоциативные контейнеры
Критична скорость доступа Список не подходит
... ...
Рекомендации:использование STL
Не пытайтесь писать контейнерно-независимый код;
Реализуйте быстрое и корректное копирование объектов в контейнерах;
Старайтесь не использовать итераторы повторно;
Используйте алгоритмы вместо циклов Всегда включайте нужные заголовки Научитесь читать сообщения
компилятора