- •Определение класса
- •Пример (точка)
- •Оператор вывода (пример)
- •Параметр шаблона по умолчанию (пример)
- •Где перехватывать исключения?
- •Гарантии безопасности исключений
- •Базовые операции
- •Виртуальная функция
- •Использование virtual
- •Массив, как диапазон
- •Контейнер
- •Свойства элемента контейнера
- •Заголовочные файлы
- •Доступ к элементам list
- •Размеры list
- •Доступ к элементам map
- •Очередь с приоритетом
- •Дэк (двусвязная очередь)
- •Матрица (в математике)
- •Атд “матрица”
- •Дерево (доп. Определения)
- •Узел дерева (доп. Определения)
- •“Родственные отношения”
- •“Родственные отношения” (иллюстрация)
- •Баланс в дереве (иллюстрация)
- •Std::less (пример функтора)
- •Std::find_if (пример алгоритма)
- •Функциональные адаптеры
- •Производящая функция
- •Производящие функции для функциональных адаптеров
Массив, как диапазон
[beg, beg + SIZE)
число элементов SIZE = last – first
last, как признак конца обработки
пример:
for (p = first; p != last; ++p)
{
if (value != *p)
...
}
14.04.2012 cppNewb.ru 11
Контейнер
является регулярным типом
содержит свои элементы
предоставляет доступ к элементам
14.04.2012 cppNewb.ru 12
Свойства элемента контейнера
элемент может принадлежать не более, чем одному контейнеру (семантика значений)
контейнеры не пересекаются
ограничение на объекты, а не на значения
время жизни элемента не превышает время жизни контейнера
создается не раньше
уничтожается не позже
14.04.2012 cppNewb.ru 13
Иерархия концепций контейнеров
Контейнер Произвольного Доступа
Реверсивный Контейнер
Однонаправленный Контейнер
Контейнер
итератор ввода
14.04.2012 cppNewb.ru 14
Итератор
интерфейс между алгоритмами и структурами данных
требования со стороны алгоритмов
регулярный тип
operator=(), operator==()
доступ к элементу контейнера
operator*(), operator->()
навигация по контейнеру
14.04.2012 cppNewb.ru 15
Итератор (пример алгоритма)
template<class I, class T>
I find(I fst, I lst, const T& val)
{
while (fst != lst && *fst != val)
++first; return first;
}
iV = find(b, e, v); if (iV != e)
...
14.04.2012 cppNewb.ru 16
Принцип идентичности
соотношения равенства итераторов и равенства объектов
-
i1
==
i2
↔
&*i1
==
&*i2
i1
==
i2
→
*i1
==
*i2
14.04.2012 cppNewb.ru 17
Константные и изменяемые итераторы
константный итератор
доступ к константному объекту
константный объект (значительно реже)
пример:
const int* pData(0);
// !не константный итератор
int* const pVariant(&pA);
14.04.2012 cppNewb.ru 18
Итератор Произвольного Доступа
допускает написание алгоритма с произвольным доступом к контейнеру
все манипуляции за амортизированное константное время
operator++(), operator--() operator+=(int)
operator-() operator<()
operator[](int)
14.04.2012 cppNewb.ru 19
Двунаправленный Итератор
допускает написание многопроходного алгоритма
operator++(), operator--()
14.04.2012 cppNewb.ru 20
Однонаправленный Итератор
допускает написание однопроходного алгоритма
operator++()
возможно существование более одного
итератора для интервала
14.04.2012 cppNewb.ru 21
Итератор Вывода
однопроходное чтение (извлечение)
элементов
не изменяет элементы
единственный итератор для диапазона
по диапазону нельзя пройти более одного раза
operator++()
14.04.2012 cppNewb.ru 22
Итератор Ввода
однопроходная запись элементов
единственный итератор для диапазона
по диапазону нельзя пройти более одного раза
не сравниваются (конец задан неявно)
operator++()
пример:
*iV = x;
14.04.2012 cppNewb.ru 23
Пример алгоритма (copy)
template<class InpI, class OutI>
OI copy(InpI first, InpI last, OutI res)
{
for (; first != last; ++res, ++first)
{
*res = *first;
}
return res;
}
14.04.2012 cppNewb.ru 24
Классы итераторов в STL
iterator и const_iterator
являются вложенными классами для классов контейнеров
пример:
list<int>::iterator list<int>::const_iterator
14.04.2012 cppNewb.ru 25
Интервал элементов контейнера
begin()
первый элемент (начало)
end()
элемент, следующий за последним (конец)
пример:
vector<int> ms;
vector<int>::iterator i(ms.begin());
14.04.2012 cppNewb.ru 26
Пример поиска
// C data;
C::iterator it(dt.end());
it = find(dt.begin(), dt.end(), k); if (dt.end() != it)
// найден элемент со значением k
{
...
}
14.04.2012 cppNewb.ru 27
Контейнеры переменного размера
Последовательность (Sequence)
Ассоциативный Контейнер
(Associative Container)
14.04.2012 cppNewb.ru 28
Вставка элемента
в конец
push_back
в начало
push_front
в произвольной позиции
insert
14.04.2012 cppNewb.ru 29
Удаление элемента
из конца
pop_back()
из начала
pop_front()
из произвольной позиции
remove()
14.04.2012 cppNewb.ru 30
Вставка и удаление интервала
из конца
pop_back()
из начала
pop_front()
из произвольной позиции
remove()
14.04.2012 cppNewb.ru 31
Последовательности в STL
vector // массив
произвольный
list // список
последовательный двунаправленный
deque // дэк
произвольный
14.04.2012 cppNewb.ru 32
Ассоциативные контейнеры в STL
set // множество
multiset // мультимножество
map // ассоциативный контейнер
multimap
// множетсвенный ассоциативный контейнер
14.04.2012 cppNewb.ru 33
typename (ключевое слово)
явное указание, что идентификатор является именем типа (в шаблонном коде)
может использоваться вместо class в
описании параметров шаблона
14.04.2012 cppNewb.ru 34
Свойства (traits)
свойства (ассоциированные типы) –
часть концепции
пример: template<class T> T
min(const T& lhs, const T& rhs)
{
return (lhs < rhs) ? lhs : rhs;
}
14.04.2012 cppNewb.ru 35
iterator_traits (для классов)
template<class I> struct iterator_traits
{
typedef typename I::value_type value_type;
};
14.04.2012 cppNewb.ru 36
iterator_traits (для указателей)
template<typename I>
struct iterator_traits<typename I*>
{
typedef I value_type;
};
template<typename I>
struct iterator_traits<typename const I*>
{
typedef I value_type;
};
14.04.2012 cppNewb.ru 37
Пример использования свойств
// сумма в непустом диапазоне
template<class I>
typename iterator_traits<I>::value_type sum(I first, I last)
{
typename iterator_traits<I>::value_type res(*first++);
for (; first != last; ++first) res += *first;
return res;
}
14.04.2012 cppNewb.ru 38
Операции над контейнерами и валидность итераторов
операции над контейнерами могут делать итераторы невалидными
(в зависимости от реализации итераторов и контейнеров)
всегда следите за валидностью итераторов
избегайте хранения итераторов
14.04.2012 cppNewb.ru 39
Реверсивные итераторы для контейнеров
значения интервала в обратном порядке
специальные свойства и методы
reverse_iterator rbegin()
rend()
отличаются от обычных итераторов
14.04.2012 cppNewb.ru 40
reverse_iterator
класс-адаптер для iterator
для [f, l) интервал [reverse_iterator(l), reverse_iterator(f)) содержит значения в обратном порядке
основное тождество
&*(reverse_iterator(i)) == &*(i - 1)
&*r == &*(r.base() - 1)
14.04.2012 cppNewb.ru 41