Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Липпман.doc
Скачиваний:
8
Добавлен:
14.08.2019
Размер:
7.54 Mб
Скачать

Алгоритм for_each()

template< class InputIterator, class Function >

Function

for_each( InputIterator first,


InputIterator last, Function func );

for_each() применяет объект-функцию func к каждому элементу в диапазоне [first,last). func не может изменять элементы, поскольку итератор записи не гарантирует поддержки присваивания. Если же модификация необходима, следует воспользоваться алгоритмом transform(). func может возвращать значение, но оно игнорируется.

#include <algorithm>

#include <vector>

#include <iostream.h>

template <class Type>

void print_elements( Type elem ) { cout << elem << " "; }

int main()

{

vector< int, allocator > ivec;

for ( int ix = 0; ix < 10; ix++ )

ivec.push_back( ix );

void (*pfi)( int ) = print_elements;

for_each( ivec.begin(), ivec.end(), pfi );

return 0;


}

Алгоритм generate()

template< class ForwardIterator, class Generator >

void

generate( ForwardIterator first,


ForwardIterator last, Generator gen );

generate() заполняет диапазон, ограниченный парой итераторов [first,last), путем последовательного вызова gen, который может быть объектом-функцией или указателем на функцию.

#include <algorithm>

#include <list>

#include <iostream.h>

int odd_by_twos() {

static int seed = -1;

return seed += 2;

}

template <class Type>

void print_elements( Type elem ) { cout << elem << " "; }

int main()

{

list< int, allocator > ilist( 10 );

void (*pfi)( int ) = print_elements;

generate( ilist.begin(), ilist.end(), odd_by_twos );

// печатается:

// элементы в списке, первый вызов:

// 1 3 5 7 9 11 13 15 17 19

cout << "элементы в списке, первый вызов:\n";

for_each( ilist.begin(), ilist.end(), pfi );

generate( ilist.begin(), ilist.end(), odd_by_twos );

// печатается:

// элементы в списке, второй вызов:

// 21 23 25 27 29 31 33 35 37 39

cout << "\n\nэлементы в списке, второй вызов:\n";

for_each( ilist.begin(), ilist.end(), pfi );

return 0;


}

Алгоритм generate_n()

template< class OutputIterator,

class Size, class Generator >

void


generate_n( OutputIterator first, Size n, Generator gen );

generate_n() заполняет последовательность, начиная с first, n раз вызывая gen, который может быть объектом-функцией или указателем на функцию.

#include <algorithm>

#include <iostream.h>

#include <list>

class even_by_twos {

public:

even_by_twos( int seed = 0 ) : _seed( seed ){}

int operator()() { return _seed += 2; }

private:

int _seed;

};

template <class Type>

void print_elements( Type elem ) { cout << elem << " "; }

int main()

{

list< int, allocator > ilist( 10 );

void (*pfi)( int ) = print_elements;

generate_n( ilist.begin(), ilist.size(), even_by_twos() );

// печатается:

// generate_n с even_by_twos():

// 2 4 6 8 10 12 14 16 18 20

cout << "generate_n с even_by_twos():\n";

for_each( ilist.begin(), ilist.end(), pfi ); cout << "\n";

generate_n( ilist.begin(), ilist.size(), even_by_twos( 100 ) );

// печатается:

// generate_n с even_by_twos( 100 ):

// 102 104 106 108 110 112 114 116 118 120

cout << "generate_n с even_by_twos( 100 ):\n";

for_each( ilist.begin(), ilist.end(), pfi );


}