<< Пред. стр. 107 (из 121) След. >>
#include#include
#include
#include
int main()
{
string s_array[] = { "Ee", "eE", "ee", "Oo", "oo", "ee" };
// возвращает первое вхождение "ee" -- &s_array[2]
string to_find[] = { "oo", "gg", "ee" };
string *found_it =
find_first_of( s_array, s_array+6,
to_find, to_find+3 );
// печатается:
// найдено: ee
// &s_array[2]: 0x7fff2dac
// &found_it: 0x7fff2dac
if ( found_it != &s_array[6] )
cout << "найдено: " << *found_it << "\n\t"
<< "&s_array[2]:\t" << &s_array[2] << "\n\t"
<< "&found_it:\t" << found_it << "\n\n";
vector< string, allocator > svec( s_array, s_array+6);
vector< string, allocator > svec_find( to_find, to_find+2 );
// возвращает вхождение "oo" -- svec.end()-2
vector< string, allocator >::iterator found_it2;
found_it2 = find_first_of(
svec.begin(), svec.end(),
svec_find.begin(), svec_find.end(),
equal_to
// печатает:
// тоже найдено: oo
// &svec.end()-2: 0x100067b0
// &found_it2: 0x100067b0
if ( found_it2 != svec.end() )
cout << "тоже найдено: " << *found_it2 << "\n\t"
<< "&svec.end()-2:\t" << svec.end()-2 << "\n\t"
<< "&found_it2:\t" << found_it2 << "\n";
}
Алгоритм 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
#include
#include
template
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
#include
#include
int odd_by_twos() {
static int seed = -1;
return seed += 2;
}
template
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
#include
#include
class even_by_twos {
public:
even_by_twos( int seed = 0 ) : _seed( seed ){}
int operator()() { return _seed += 2; }
private:
int _seed;
};
template
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 );
}
Алгоритм includes()
template< class InputIterator1, class InputIterator2 >
bool
includes( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2 );
template< class InputIterator1, class InputIterator2,
class Compare >
bool
includes( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
Compare comp );
includes() проверяет, каждый ли элемент последовательности [first1,last1) входит в последовательность [first2,last2). Первый вариант предполагает, что последовательности отсортированы в порядке, определяемом оператором “меньше”; второй – что порядок задается параметром-типом comp.
#include
#include
#include
int main()
{
int ia1[] = { 13, 1, 21, 2, 0, 34, 5, 1, 8, 3, 21, 34 };
int ia2[] = { 21, 2, 8, 3, 5, 1 };
// алгоритму includes следует передавать отсортированные контейнеры
sort( ia1, ia1+12 ); sort( ia2, ia2+6 );
// печатает: каждый элемент ia2 входит в ia1? Да
bool res = includes( ia1, ia1+12, ia2, ia2+6 );
cout << "каждый элемент ia2 входит в ia1? "
<< (res ? "Да" : "Нет") << endl;
vector< int, allocator > ivect1( ia1, ia1+12 );
vector< int, allocator > ivect2( ia2, ia2+6 );
// отсортирован в порядке убывания
sort( ivect1.begin(), ivect1.end(), greater
sort( ivect2.begin(), ivect2.end(), greater
res = includes( ivect1.begin(), ivect1.end(),
ivect2.begin(), ivect2.end(),
greater
// печатает: каждый элемент ivect2 входит в ivect1? Да
cout << "каждый элемент ivect2 входит в ivect1? "
<< (res ? "Да" : "Нет") << endl;
}
Алгоритм inner_product()
template< class InputIterator1, class InputIterator2
class Type >
Type
inner_product(
InputIterator1 first1, InputIterator1 last,
InputIterator2 first2, Type init );
template< class InputIterator1, class InputIterator2
class Type,
class BinaryOperation1, class BinaryOperation2 >
Type
inner_product(
InputIterator1 first1, InputIterator1 last,
InputIterator2 first2, Type init,
BinaryOperation1 op1, BinaryOperation2 op2 );
Первый вариант суммирует произведения соответственных членов обеих последовательностей и прибавляет результат к начальному значению init. Первая последовательность ограничена итераторами [first1,last1), вторая начинается с first2 и обходится синхронно с первой. Например, если даны последовательности {2,3,5,8} и {1,2,3,4}, то результат вычисляется следующим образом:
2*1 + 3*2 + 5*3 + 8*4
Если начальное значение равно 0, алгоритм вернет 55.
Во втором варианте вместо сложения используется бинарная операция op1, а вместо умножения – бинарная операция op1. Например, если для приведенных выше последовательностей применить вычитание в качестве op1 и сложение в качестве op2, то результат будет вычисляться так:
(2+1) - (3+2) - (5+3) - (8+4)
inner_product() – это один из численных алгоритмов. Для его использования в программу необходимо включить заголовочный файл
#include
#include
#include
int main()
{
int ia[] = { 2, 3, 5, 8 };
int ia2[] = { 1, 2, 3, 4 };
// перемножить пары элементов из обоих массивов,
// сложить и добавить начальное значение: 0
int res = inner_product( &ia[0], &ia[4], &ia2[0], 0 );
// печатает: скалярное произведение массивов: 55
cout << "скалярное произведение массивов: "
<< res << endl;
vector
vector
// сложить пары элементов из обоих векторов,
// вычесть из начального значения: 0
res = inner_product( vec.begin(), vec.end(),
vec2.begin(), 0,
minus
// печатает: скалярное произведение векторов: -28
cout << "скалярное произведение векторов: "
<< res << endl;
return 0;
}
Алгоритм inplace_merge()
template< class BidirectionalIterator >
void
inplace_merge( BidirectionalIterator first,
BidirectionalIterator middle,
BidirectionalIterator last );
template< class BidirectionalIterator, class Compare >
void
inplace_merge( BidirectionalIterator first,
BidirectionalIterator middle,
BidirectionalIterator last, Compare comp );
inplace_merge() объединяет две соседние отсортированные последовательности, ограниченные парами итераторов [first,middle) и [middle,last). Результирующая последовательность затирает исходные, начиная с позиции first. В первом варианте для упорядочения элементов используется оператор “меньше”, определенный для типа элементов контейнера, во втором – операция сравнения, переданная программистом.
#include
#include
#include
template
void print_elements( Type elem ) { cout << elem << " "; }
/*
* печатает:
ia разбит на два отсортированных подмассива:
12 15 17 20 23 26 29 35 40 51 10 16 21 41 44 54 62 65 71 74
ia inplace_merge:
10 12 15 16 17 20 21 23 26 29 35 40 41 44 51 54 62 65 71 74
ivec разбит на два отсортированных подвектора:
51 40 35 29 26 23 20 17 15 12 74 71 65 62 54 44 41 21 16 10
ivec inplace_merge:
74 71 65 62 54 51 44 41 40 35 29 26 23 21 20 17 16 15 12 10
*/
int main()
{