Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C++ для начинающих (Стенли Липпман) 3-е хххх.pdf
Скачиваний:
84
Добавлен:
30.05.2015
Размер:
5.92 Mб
Скачать

С++ для начинающих

1091

}

template < class InputIterator, class Predicate > iterator_traits<InputIterator>::distance_type count_if( InputIterator first,

Алгоритм count_if()

InputIterator last, Predicate pred );

count_if() применяет предикат pred к каждому элементу из диапазона, ограниченного парой итераторов [first,last). Алгоритм сообщает, сколько раз предикат оказался равным true.

С++ для начинающих

1092

#include <algorithm> #include <list> #include <iostream.h>

class Even { public:

bool operator()( int val )

{ return val%2 ? false : true; }

};

int main()

{

int ia[] = {0,1,1,2,3,5,8,13,21,34}; list< int,allocator > ilist( ia, ia+10 );

/* * не поддерживается в текущей реализации

*****************************************************

typedef iterator_traits<InputIterator>::distance_type

distance_type;

distance_type ia_count, list_count;

// счетчик четных элементов: 4

ia_count = count_if( &ia[0], &ia[10], Even() ); list_count = count_if( ilist.begin(), ilist_end(),

bind2nd(less<int>(),10) );

******************************************************

*/

int ia_count = 0;

count_if( &ia[0], &ia[10], Even(), ia_count );

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

//count_if(): есть 4 четных элемент(а).

cout << "count_if(): есть "

<< ia_count << " четных элемент(а).\n";

int list_count = 0;

count_if( ilist.begin(), ilist.end(), bind2nd(less<int>(),10), list_count );

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

//count_if(): есть 7 элемент(ов), меньших 10.

cout << "count_if(): есть "

<<list_count

<<" элемент(ов), меньших 10.\n";

}

С++ для начинающих

1093

template< class InputIterator1, class InputIterator2 > bool

equal( InputIterator1 first1,

InputIterator1 last, InputIterator2 first2 );

template< class InputIterator1, class InputIterator2, class BinaryPredicate >

bool

equal( InputIterator1 first1, InputIterator1 last,

Алгоритм equal()

InputIterator2 first2, BinaryPredicate pred );

equal() возвращает true, если обе последовательности одинаковы в диапазоне, ограниченном парой итераторов [first,last). Если вторая последовательность содержит дополнительные элементы, они игнорируются. Чтобы убедиться в

if ( vec1.size() == vec2.size() &&

тождественности данных последовательностей, необходимо написать: equal( vec1.begin(), vec1.end(), vec2.begin() );

или воспользоваться оператором равенства, определенном в классе самого контейнера: vec1 == vec2. Если второй контейнер содержит меньше элементов, чем первый, и алгоритму приходится просматривать элементы за концом контейнера, то поведение программы не определено. По умолчанию для сравнения применяется оператор равенства в классе элементов контейнера, а во втором варианте алгоритма указанный предикат pred.

С++ для начинающих

1094

#include <algorithm> #include <list> #include <iostream.h>

class equal_and_odd{ public:

bool

operator()( int val1, int val2 )

{

return ( val1 == val2 &&

( val1 == 0 || val1 % 2 )) ? true : false;

}

};

int main()

{

int ia[] = { 0,1,1,2,3,5,8,13 };

int ia2[] = { 0,1,1,2,3,5,8,13,21,34 };

bool res;

//true: обе последовательности совпадают до длины ia

//печатается: int ia[7] равно int ia2[9]? Да.

res = equal( &ia[0], &ia[7], &ia2[0] ); cout << "int ia[7] равно int ia2[9]? "

<< ( res ? "Да" : "Нет" ) << ".\n";

list< int, allocator > ilist( ia, ia+7 ); list< int, allocator > ilist2( ia2, ia2+9 );

// печатается: список ilist равен ilist2? Да.

res = equal( ilist.begin(), ilist.end(), ilist2.begin() ); cout << "список ilist равен ilist2? "

<<( res ? "Да" : "Нет" ) << ".\n";

//false: 0, 2, 8 не являются равными и нечетными

//печатается: список ilist equal_and_odd() ilist2? Нет.

res = equal( ilist.begin(), ilist.end(), ilist2.begin(), equal_and_odd() );

cout << "список ilist equal_and_odd() ilist2? " << ( res ? "Да" : "Нет" ) << ".\n";

return 0;

}