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

Std::less (пример функтора)

template<class T> struct less

: binary_function<T, T, bool>

{

bool operator()(const T& x,

const T& y) const

{

return x < y;

}

};

28.04.2012

cppNewb.ru 53

Std::find_if (пример алгоритма)

template<class InputIt,

class

Predicate>

InputIt

find_if(InputIt

first,

InputIt last, Predicate pred)

{

for(; first != last; ++first) if (pred(*first))

break; return first;

}

28.04.2012

cppNewb.ru 54

Функциональные адаптеры

  • указатель на функцию -> функтор

pointer_to_binary_function, …

  • связывание аргумента

binder1st, binder2nd

  • метод -> функтор

mem_fun_t, …

  • отрицание функтора

unary_negate, binary_negate

28.04.2012

cppNewb.ru 55

stl::bind1st

template<class Op> class bind1st

: public unary_function<

typename Op::second_argument_type, typename Op::result_type>

{ protected:

Op op;

typename Op::first_argument_type value;

...

28.04.2012

cppNewb.ru 56

...

public:

stl::bind1st

bind1st(const Op& x,

const typename Op::first_argument_type& y)

: op(x), value(y)

{}

typename Op::result_type operator()(

const typename Op::second_argument_type& x) const

{

return op(value,x);

}

};

28.04.2012

cppNewb.ru 57

std::pointer_to_unary_function

template<class Arg, class Res> class pointer_to_unary_function

: public unary_function<Arg, Res>

{ protected:

Res(*pfunc)(Arg); public:

explicit pointer_to_unary_function(Res(*f)(Arg))

: pfunc (f) {}

Res operator()(Arg x) const { return pfunc(x); }

};

28.04.2012

cppNewb.ru 58

Производящая функция

  • создание объекта заданного типа

  • в шаблонном варианте автоматически выводит тип объекта по типам аргументов

28.04.2012

cppNewb.ru 59

Производящие функции для функциональных адаптеров

  • указатель на функцию -> функтор

ptr_fun

  • связывание аргумента

bind1st, bind2nd

  • метод -> функтор

mem_fun, mem_fun_ref

  • отрицание функтора

not1, not2

28.04.2012

cppNewb.ru 60

std::ptr_fun

(пример производящей функции)

template<class Arg, class Res> pointer_to_unary_function<Arg, Res> ptr_fun(Res (*f)(Arg))

{

return pointer_to_unary_function

<Arg, Res>(f);

}

28.04.2012

cppNewb.ru 61

Стандартные алгоритмы

  • информация о последовательности

  • поиск

  • модификация, в т.ч.

    • слияние

    • удаление

    • сортировка

  • перестановка

28.04.2012

cppNewb.ru 62

Стандартные алгоритмы

(для сортированных диапазонов)

  • поиск (бинарный)

  • слияние

  • теоретико-множественные

    • проверка вхождения

    • объединение

    • пересечений

    • разница

    • симметрическая разница

28.04.2012

cppNewb.ru 63

Поиск

It find(It first,It last, const T& val);

It find_if(It first,It last, UnF pred);

28.04.2012

cppNewb.ru 64

Поиск (бинарный)

bool binary_search(

It first,It last, const T& val [, Compare comp]);

It lower_bound(

It first,It last, const T& val [, Compare comp]);

It upper_bound(

It first,It last, const T& val [, Compare comp]);

28.04.2012

cppNewb.ru 65

Информация о диапазонах

  • count

    • подсчет элементов

  • count_if

    • подсчет элементов с предикатом

  • equal

    • сравнение диапазонов

  • lexicographical_compare

    • лексикографическое сравнение диапазонов

28.04.2012

cppNewb.ru 66

Модификация диапазонов

  • for_each

  • transform

  • fill

  • generate

  • swap

  • equal

  • rotate

  • random_shaffle

  • remove (_if)

  • copy (_if)

  • replace

  • insert

  • partition

  • unique

28.04.2012

cppNewb.ru 67

std::for_each

(вызов функции для элементов)

template<class InpIt, class Func> Function for_each(InpIt first,

InpIt last, Func f)

{

for ( ; first!=last; ++first) f(*first);

return f;

}

28.04.2012

cppNewb.ru 68

std::copy

(копирование диапазона)

template<class InpIt, class OutIt> OutIt copy(InpIt first, InpItlast,

OutIt result )

{

while (first != last)

*result++ = *first++; return result;

}

28.04.2012

cppNewb.ru 69

Копирование диапазона в поток

  • копирование диапазона может использоваться для ввода/вывода

пример:

ostream_iterator<int> out_it (cout, ", ");

copy(vec.begin(), vec.end(), out_it);

28.04.2012

cppNewb.ru 70

Адаптирующие итераторы

  • insert_iterator

  • back_insert_iterator

  • front_insert_itarator

28.04.2012

cppNewb.ru 71

std::back_insert (адаптирующий итератора)

  • вставка элементов в конец контейнера для алгоритмов переписывающих значения (например, copy)

  • контейнер должен обеспечивать

push_back

  • вызов operator= приводит к вставке,

остальные операции ничего не меняют

28.04.2012

cppNewb.ru 72

std::back_inserter (производящая функция)

template <class Cont> back_insert_iterator<Cont> back_inserter(Cont& x)

28.04.2012

cppNewb.ru 73

Конструирование алгоритмов

  • как «склеить» две последовательности?

    • скопировать одну в конец второй

пример:

list<int>::iterator it(firList.begin()); advance (it, 3); insert_iterator<list<int> >

insertIt(firList, it); copy(secList.begin(),secList.end(),

insertIt);

28.04.2012

cppNewb.ru 74

Операции над итераторами

  • advance

    • смещение итератора

  • difference

    • расстояние между итераторами

28.04.2012

cppNewb.ru 75

Рекомендации

  • избегайте повторного написания алгоритмов

  • конструируйте алгоритмы

  • помните о копировании объектов

  • читайте книги и практикуйте 8)

28.04.2012

cppNewb.ru 76

А где в stl стек или очередь?

  • адаптер

    • класс преобразующий интерфейс объекта к нужному интерфейсу

    • в stl – шаблонный класс

  • адаптеры контейнеров

std::stack std::queue std::prioriy_queue

28.04.2012

cppNewb.ru 77

std::stack (адаптер)

template<class T,

class Cont = deque<T> > class stack;

bool empty() const size_t size() const

value_type& top() // const

void push(const T&) void pop()

28.04.2012

cppNewb.ru 78

std::queue (адаптер)

template<class T,

class Cont = deque<T> > class queue;

bool empty() const size_t size() const

value_type& front() value_type& back() const

void push(const T&) void pop()

28.04.2012

cppNewb.ru 79

std::priority_queue (адаптер)

class

Cont

=

class

>

Cmp =

template<class T, vector<T>,

less<typename Cont::value_type>

class priority_queue;

bool empty() const size_t size() const

value_type& top() // const

void push(const T&) void pop()

28.04.2012

cppNewb.ru 80