Итераторы и функциональные объекты

Содержание

Слайд 2

Итераторы

В итераторах есть понятия «текущий элемент», «указать на следующий элемент»
Доступ к

Итераторы В итераторах есть понятия «текущий элемент», «указать на следующий элемент» Доступ
текущему элементу * или - >
Переход к следующему элементу ++
Определены присваивание, проверка на равенство и неравенство
i++ ; ++i; i=j; i = = j; i != j;

Слайд 3

Типы итераторов

Типы итераторов

Слайд 4

Итератор может быть

Действительным или недействительным
Итератор не был инициализирован
Контейнер, с которым связан

Итератор может быть Действительным или недействительным Итератор не был инициализирован Контейнер, с
итератор, уничтожен или изменил размеры
Итератор указывает на конец последовательности

Слайд 5


distance (InputIterator first, InputIterator last);
Возвращает разность между двумя итераторами
void advance (InputIterator

distance (InputIterator first, InputIterator last); Возвращает разность между двумя итераторами void advance
& i, Distance n);
i+=n;

Слайд 6

reverse_iterator

* , - >, ++, - -, +, -, +=, -=, [

reverse_iterator * , - >, ++, - -, +, -, +=, -=,
]
current
= =, !=, <, <=, >=
rbegin (), rend()
vector v;
for( vector reverse_iterator i= v.rbegin(); i!= rend(); ++i ) cout < < *i < < « »;

Слайд 7

back_insert_iterator
front_insert_iterator
insert_iterator
back_inserter( C& x);
front_inserter (C& x);
Inserter (C& x, Iter i);

Итераторы вставки

back_insert_iterator front_insert_iterator insert_iterator back_inserter( C& x); front_inserter (C& x); Inserter (C& x, Iter i); Итераторы вставки

Слайд 8

Потоковые итераторы

Итератор входного потока istream_iterator
Итератор выходного потока ostream_iterator

Потоковые итераторы Итератор входного потока istream_iterator Итератор выходного потока ostream_iterator

Слайд 9

Итератор входного потока

Читает элементы из потока
istream in («temp»);
istream_iterator i(in);
int buf= *i;
++i;

Итератор входного потока Читает элементы из потока istream in («temp»); istream_iterator i(in);
int buf1= *i;
while ( i !=istream_iterator ())
cout < < *i;

Слайд 10

Особенность итераторов входного потока

Из i = = j не следует ++ i

Особенность итераторов входного потока Из i = = j не следует ++
= = ++ j

Слайд 11

Итераторы выходного потока

Записывают с помощью < < элементы в выходной поток
ostream_iterator

Итераторы выходного потока Записывают с помощью ostream_iterator os (cout, «кг»); *os=100; ++os; *os= 2;
os (cout, «кг»);
*os=100;
++os; *os= 2;

Слайд 12

Функциональные объекты

Класс, в котором определена операция вызова функции
Используются в качестве параметров стандартных

Функциональные объекты Класс, в котором определена операция вызова функции Используются в качестве
алгоритмов для задания критериев сравнения или способов их обработки

Предикат – функциональный объект или обычная функция, возвращающая bool

Слайд 13

Шаблоны базовых классов

template
struct unary_function {
typedef Arg argument_type;
typedef

Шаблоны базовых классов template struct unary_function { typedef Arg argument_type; typedef Result
Result result_type; };
template
typedef Arg1 first_argument_type;
typedef Arg2 second_argument_type;
typedef Result result_type; };

Слайд 14

Адаптеры функций

Функция, которая получает в качестве аргумента функцию и конструирует из нее

Адаптеры функций Функция, которая получает в качестве аргумента функцию и конструирует из
другую функцию.
Связыватели
Отрицатели
Адаптеры указателей на функцию
Адаптеры методов

Слайд 15

Арифметические функциональные объекты

Арифметические функциональные объекты

Слайд 16

Предикаты

Предикаты

Слайд 17

Предикат equal_to

template struct equal_to:
binary_function
{ bool operator

Предикат equal_to template struct equal_to: binary_function { bool operator () (const T&
() (const T& x, const T& y) const
{ return x = =y;
}
};

Слайд 18

Пример пользовательского предиката

struct monstr_less_ammo:
public binary_function (
bool operator ()

Пример пользовательского предиката struct monstr_less_ammo: public binary_function ( bool operator () (
( monstr &m1, monstr &m2)
{
return m1. get_ammo () < m2.get_ammo();
}
};

Предикат сравнивает двух монстров
по значению поля ammo

Слайд 19

Отрицатели

not1 , not2
Применяются для получения противоположного предиката
not2 (less ()) greater_equal

Отрицатели not1 , not2 Применяются для получения противоположного предиката not2 (less ()) greater_equal

Слайд 20

Связыватели

bind2nd
bind1st
Позволяют связать с конкретным значением второй и первый аргумент бинарной функции

Связыватели bind2nd bind1st Позволяют связать с конкретным значением второй и первый аргумент бинарной функции

Слайд 21

Пример со связывателем

Пусть требуется вычислить количество элементов целочисленного массива, меньших 40
#include #include
#include<

Пример со связывателем Пусть требуется вычислить количество элементов целочисленного массива, меньших 40
algorithm> using namespace std;
int main()
{
int m[8]= {45,65, 36, 25, 674,2,13,35};
cout < < count_if ( m, m+8, bind2nd (less(), 40));
return 0;
}

Слайд 22

Адаптеры указателей на функцию

pointer_to_unary_function
pointer_to_binary_function
Нужны, чтобы применять связыватели к обычным указателям на функции
ptr_fun
функции_адаптеры,

Адаптеры указателей на функцию pointer_to_unary_function pointer_to_binary_function Нужны, чтобы применять связыватели к обычным
которые преобразуют переданный им в качестве параметра указатель на функцию в функциональный объект

Слайд 23

Пример применения адаптера функции

#include #include
#include using namespace std;
struct A { int x,

Пример применения адаптера функции #include #include #include using namespace std; struct A
int y; };
bool lss (A a1, A a2){ return a1.xint main ()
{ A ma[5] ={{2,4}, {3,1}, {2,2}, {1,2}, {1,2}};
A elem= {3,0};
cout < < count_if (ma, ma+5, bind2nd( ptr_fun( lss), elem);
return 0;}

Слайд 24

Пример применения адаптера функции

#include #include
#include #include
using namespace std;
enum color {red, green, blue};
class

Пример применения адаптера функции #include #include #include #include using namespace std; enum
monstr {
int health, ammo; color skin; char * name;
public: monstr ( int he=100, int am=10);
monstr (color sk); monstr ( const *nam);
monstr (const monstr &M);

Слайд 25

Пример применения адаптера функции

~monstr (){ delete [ ] name;}
operator int() { return

Пример применения адаптера функции ~monstr (){ delete [ ] name;} operator int()
health;}
Int get_health(){ return health();}
friend ostream&
operator < < (ostream & out, monstr & m)
{ return out < < «monstr: « < < «ammo= «
< };

Слайд 26

Пример применения адаптера функции

monstr :: monstr (int he, int am):
health(he), ammo(am), skin(red),

Пример применения адаптера функции monstr :: monstr (int he, int am): health(he),
name(0){}
monstr :: monstr (const monstr &M)
{ if (M.name){ name= new char [strlen( M,name)+1];
strcpy( name, M.name);}
else name=0;
health= M.health; ammo= M.ammo; skin= M.skin;}
monstr:: monstr (char * nam)
{ name= new char [strlen (nam)+1]; strcpy(name,nam);
health=200; ammo=10; skin=red;}

Слайд 27

Пример применения адаптера функции

monstr:: monstr (color sk)
{
switch(sk) {
case

Пример применения адаптера функции monstr:: monstr (color sk) { switch(sk) { case
red: health=1; ammo=10; skin=red; name=0; break;
case green: health=2; ammo=20; skin=green; name=0; break;
case blue: health=3; ammo=40; skin=blue; name=0;
break;
}}

Слайд 28

Пример применения адаптера функции

bool less_health (monstr m1, monstr m2)
{ return m1.get_health()

Пример применения адаптера функции bool less_health (monstr m1, monstr m2) { return
int main()
{ vector m;
monstr M(10,30);
m.push_back(M);
m.push_back( monstr(«Vasia»);
m.push_back(monstr(red));

Слайд 29

Пример применения адаптера функции

cout < < «Monstry:» < for (int i=0; i

Пример применения адаптера функции cout for (int i=0; i cout cout cout
cout < < m[i] < < « »;
cout < < endl;
cout < < «Count_if :»;
cout < < count_if (m.begin(), m.end(),
bind2nd (ptr_fun (less_health),20));
return 0;
}

Слайд 30

Результаты работы программы

Monstry:
monstr : ammo=30 health =10
monstr : ammo=10 health=200
monstr: ammo=10 health=1
Count_if

Результаты работы программы Monstry: monstr : ammo=30 health =10 monstr : ammo=10
: 2

Слайд 31

Адаптеры методов

#include #include
using namespace std;
void show (int a){ cout < <

Адаптеры методов #include #include using namespace std; void show (int a){ cout
a< < endl;}
int main()
{ int m[4]={3,5,9,6};
for_each( m,m+4, show);
return 0;
}

Слайд 32

Адаптеры методов

Позволяют использовать методы классов в качестве аргументов стандартных алгоритмов
Адаптер получает функцию

Адаптеры методов Позволяют использовать методы классов в качестве аргументов стандартных алгоритмов Адаптер
и конструирует из нее другую функцию

Слайд 33

Стандартные адаптеры методов

Стандартные адаптеры методов
Имя файла: Итераторы-и-функциональные-объекты.pptx
Количество просмотров: 32
Количество скачиваний: 0