Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции С++.docx
Скачиваний:
4
Добавлен:
22.09.2019
Размер:
6.95 Mб
Скачать

Массив, как диапазон

  • [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