контейнеры stl

19
КОНТЕЙНЕРЫ STL Михаил Кройтор

Upload: mcroitor

Post on 15-Jun-2015

461 views

Category:

Education


2 download

DESCRIPTION

Небольшой обзор контейнеров STL и итераторов.

TRANSCRIPT

Page 1: контейнеры STL

КОНТЕЙНЕРЫ STL

Михаил Кройтор

Page 2: контейнеры STL

Содержание

Итераторы Свойства итераторов Контейнеры Общие свойства контейнеров Последовательные контейнеры Ассоциативные контейнеры Использование контейнеров рекомендации

Page 3: контейнеры STL

Обозначения

обозначения Х - некторый класс (контейнер); u, a, b - объекты класса X; r - итератор; T - значимый тип (элементов

контейнера); t - значение типа T; n - целочисленное значение.

Page 4: контейнеры STL

Итераторы

Итератор - объект, предоставляющий доступ к элементам контейнера и позволяющий их перебирать.

ВИДЫ ИТЕРАТОРОВ

Итератор ввода

Итератор вывода

Последовательный итератор

Итератор произв. доступа

Двунаправленный итератор

Page 5: контейнеры STL

Итераторы

Итератор ввода (input iterator) – позволяет получать значения элементов контейнера;

Итератор вывода (output iterator) – позволяет изменять значения элементов контейнера;

Последовательный итератор (forward iterator) – гарантируют последовательный перебор элементов;

Двунаправленный итератор (bidirectional iterator) – позволяют перебирать элементы контейнера как в прямом, так и в обратном порядке;

Итератор произвольного доступа (random access iterator) – ;

Page 6: контейнеры STL

Свойства итераторов:итераторы ввода

Свойство Пояснение

X(a)X u(a);X u = a;

Конструктор копирования. Предполагается наличие деструктора

a = b; Оператор копирования.

a==b;a != b;

Операторы сравнения

*a; Оператор разыменования. Возвращается ссылка на объект из контейнера.

++r;r++;

Последовательный перебор итераторов

NB: Итераторы ввода не гарантируют, что если a == b, то a++ == b++

Page 7: контейнеры STL

Свойства итераторов:итераторы вывода

Свойство Пояснение

X(a)X u(a);X u = a;

Конструктор копирования. Предполагается наличие деструктора

*a = t; Оператор разыменования. Возвращается ссылка на объект из контейнера.

++r;r++;

Последовательный перебор итераторов

Page 8: контейнеры STL

Свойства итераторов:последовательные итераторы

Свойство Пояснение

Обладает всеми свойствами итераторов ввода и вывода

a==b;a != b;

Операторы сравнения.a == b => ++a == ++b

Page 9: контейнеры STL

Свойства итераторов:двунаправленные итераторы

Свойство Пояснение

Обладает всеми свойствами последовательных итераторов

--r;r--;

Последовательный перебор итераторов

Page 10: контейнеры STL

Свойства итераторов:итераторы произвольного доступа

Свойство Пояснение

Обладает всеми свойствами двунаправленных итераторов

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;

Операторы упорядочения.

Page 11: контейнеры STL

Контейнеры

под контейнером понимают объект, содержащий другие (обычно однотипные) объекты.

Доступ к элементом контейнера осуществляется через итераторы.

Контейнеры С++ представляют собой шаблонные классы с общим базовым интерфейсом.

Page 12: контейнеры STL

Конетйнеры

Список (list) Очередь (deque) Вектор (vector)

Множество (set) Хеш-массив

(map) Множество с

повторами (multiset)

Хеш-массив с повторами (multimap)

Последовательные Ассоциативные

Page 13: контейнеры STL

Контейнеры: структуравыражение значение

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() Проверяет, если контейнер пустой

… …

Page 14: контейнеры STL

Последовательные контейнеры:общие свойства

выражение значение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).

Page 15: контейнеры STL

Последовательные контейнеры:дополнительные свойства

выражение

семантика контейнер

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

Page 16: контейнеры STL

Ассоциативные контейнеры:общие свойства

свойство пояснение

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) Подсчет элементов с ключом, равным к

… …

Page 17: контейнеры STL

Использование контейнеров

Page 18: контейнеры STL

Рекомендации:выбор контейнера

Критерий Рекомендация

Возможность вставки нового элемента на произвольную позицию контейнера

Если нужна, выбирайте последовательный контейнер; ассоциативные контейнеры не подходят.

Структура памяти контейнера должна соответствовать правилам языка C

Только vector

критична скорость поиска Рассмотрите сортированные векторы и ассоциативные контейнеры

Критична скорость доступа Список не подходит

... ...

Page 19: контейнеры STL

Рекомендации:использование STL

Не пытайтесь писать контейнерно-независимый код;

Реализуйте быстрое и корректное копирование объектов в контейнерах;

Старайтесь не использовать итераторы повторно;

Используйте алгоритмы вместо циклов Всегда включайте нужные заголовки Научитесь читать сообщения

компилятора