3. Обозначения
обозначения
Х - некторый класс (контейнер);
u, a, b - объекты класса X;
r - итератор;
T - значимый тип (элементов контейнера);
t - значение типа T;
n - целочисленное значение.
4. Итераторы
Итератор - объект, предоставляющий доступ к
элементам контейнера и позволяющий их
перебирать.
ВИДЫ ИТЕРАТОРОВ
Итератор вывода
Итератор ввода
Последовательный итератор
Двунаправленный итератор
Итератор произв. доступа
5. Итераторы
Итератор ввода (input iterator) – позволяет
получать значения элементов контейнера;
Итератор вывода (output iterator) – позволяет
изменять значения элементов контейнера;
Последовательный итератор (forward iterator) –
гарантируют последовательный перебор
элементов;
Двунаправленный итератор (bidirectional iterator)
– позволяют перебирать элементы контейнера как
в прямом, так и в обратном порядке;
Итератор произвольного доступа (random access
iterator) – ;
6. Свойства итераторов:
итераторы ввода
Свойство
Пояснение
X(a)
X u(a);
X u = a;
Конструктор копирования. Предполагается наличие
деструктора
a = b;
Оператор копирования.
a==b;
a != b;
Операторы сравнения
*a;
Оператор разыменования. Возвращается ссылка на объект
из контейнера.
++r;
r++;
Последовательный перебор итераторов
NB: Итераторы ввода не гарантируют,
что если a == b, то a++ == b++
7. Свойства итераторов:
итераторы вывода
Свойство
Пояснение
X(a)
X u(a);
X u = a;
Конструктор копирования. Предполагается наличие
деструктора
*a = t;
Оператор разыменования. Возвращается ссылка на объект
из контейнера.
++r;
r++;
Последовательный перебор итераторов
10. Свойства итераторов:
итераторы произвольного доступа
Свойство
Пояснение
Обладает всеми свойствами двунаправленных итераторов
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;
Операторы упорядочения.
11. Контейнеры
под контейнером понимают объект, содержащий другие
(обычно однотипные) объекты.
Доступ к элементом контейнера осуществляется через
итераторы.
Контейнеры С++ представляют собой шаблонные классы
с общим базовым интерфейсом.
13. Контейнеры: структура
выражение
значение
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()
Проверяет, если контейнер пустой
…
…
14. Последовательные контейнеры:
общие свойства
выражение
значение
X(n, t)
X a(n, t);
X(i, j)
X a(i, j);
a.insert(p, t)
a.insert(p, n, t)
после: size() == n.
создаёт последовательность с n копиями t.
после: size() == расстоянию между i и j.
создаёт последовательность, равную диапазону *i, j).
вставляет копию t перед p.
возвращаемое значение указывает на вставленную копию.
вставляет n копий t перед p.
a.insert(p, i, j)
вставляет копии элементов из диапазона *i, j) перед p.
a.erase(q)
удаляет элемент, указываемый q.
a.erase(ql, q2)
удаляет элементы в диапазоне *ql, q2).
16. Ассоциативные контейнеры:
общие свойства
свойство
пояснение
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)
Подсчет элементов с ключом, равным к
…
…
18. Рекомендации:
выбор контейнера
Критерий
Рекомендация
Возможность вставки нового
элемента на произвольную позицию
контейнера
Если нужна, выбирайте
последовательный контейнер;
ассоциативные контейнеры не подходят.
Структура памяти контейнера
должна соответствовать правилам
языка C
Только vector
критична скорость поиска
Рассмотрите сортированные векторы и
ассоциативные контейнеры
Критична скорость доступа
Список не подходит
...
...
19. Рекомендации:
использование STL
Не пытайтесь писать контейнерно-независимый
код;
Реализуйте быстрое и корректное копирование
объектов в контейнерах;
Старайтесь не использовать итераторы
повторно;
Используйте алгоритмы вместо циклов
Всегда включайте нужные заголовки
Научитесь читать сообщения компилятора