count_if( InputIterator first,
InputIterator last, Predicate pred );
count_if() применяет предикат pred к каждому элементу из диапазона, ограниченного парой итераторов [first,last). Алгоритм сообщает, сколько раз предикат оказался равным true.
#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_traitsInputIterator::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(lessint(),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(lessint(),10), list_count );
// печатается:
// count_if(): есть 7 элемент(ов), меньших 10.
cout "count_if(): есть "
list_count
" элемент(ов), меньших 10.\n";
}
Алгоритм equal()
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,
InputIterator2 first2, BinaryPredicate pred );
equal() возвращает true, если обе последовательности одинаковы в диапазоне, ограниченном парой итераторов [first,last). Если вторая последовательность содержит дополнительные элементы, они игнорируются. Чтобы убедиться в тождественности данных последовательностей, необходимо написать:
if ( vec1.size() == vec2.size() &&
equal( vec1.begin(), vec1.end(), vec2.begin() );
или воспользоваться оператором равенства, определенном в классе самого контейнера: vec1 == vec2. Если второй контейнер содержит меньше элементов, чем первый, и алгоритму приходится просматривать элементы за концом контейнера, то поведение программы не определено. По умолчанию для сравнения применяется оператор равенства в классе элементов контейнера, а во втором варианте алгоритма - указанный предикат pred.
#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 );
listint, allocator ilist2( ia2, ia2+9 );