К каждому элементу из диапазона [first,last) последовательно применяется предикат pred. Если он возвращает true, поиск прекращается. find_if() возвращает итератор типа InputIterator, указывающий на найденный элемент; в противном случае возвращается last.
#include algorithm
#include list
#include set
#include string
#include iostream.h
// альтернатива оператору равенства
// возвращает true, если строка содержится в объекте-члене FriendSet
class OurFriends { // наши друзья
public:
bool operator()( const string& str ) {
return ( friendset.count( str ));
}
static void
FriendSet( const string *fs, int count ) {
copy( fs, fs+count,
inserter( friendset, friendset.end() ));
}
private:
static set string, lessstring, allocator friendset;
};
set string, lessstring, allocator OurFriends::friendset;
int main()
{
string Pooh_friends[] = { "Пятачок", "Тигра", "Иа-Иа" };
string more_friends[] = { "Квазимодо", "Чип", "Пятачок" };
liststring,allocator lf( more_friends, more_friends+3 );
// заполнить список друзей Пуха
OurFriends::FriendSet( Pooh_friends, 3 );
liststring,allocator::iterator our_mutual_friend;
our_mutual_friend =
find_if( lf.begin(), lf.end(), OurFriends());
// печатается:
// Представьте-ка, наш друг Пятачок - также друг Пуха.
if ( our_mutual_friend != lf.end() )
cout "Представьте-ка, наш друг "
*our_mutual_friend
" также друг Пуха.\n";
return 0;
}
Алгоритм find_end()
template class ForwardIterator1, class ForwardIterator2
ForwardIterator1
find_end( ForwardIterator1 first1, ForwardIterator1 last1,
ForwardIterator2 first2, ForwardIterator2 last2 );
template class ForwardIterator1, class ForwardIterator2,
class BinaryPredicate
ForwardIterator1
find_end( ForwardIterator1 first1, ForwardIterator1 last1,
ForwardIterator2 first2, ForwardIterator2 last2,
BinaryPredicate pred );
В последовательности, ограниченной итераторами [first1,last1), ведется поиск последнего вхождения последовательности, ограниченной парой [first2,last2). Например, если первая последовательность - это Mississippi, а вторая - ss, то find_end() возвращает итератор, указывающий на первую s во втором вхождении ss. Если вторая последовательность не входит в первую, то возвращается last1. В первом варианте используется оператор равенства, определенный для типа элементов контейнера, а во втором - бинарный предикат, переданный пользователем.
#include algorithm
#include vector
#include iostream.h
#include assert.h
int main()
{
int array[ 17 ] = { 7,3,3,7,6,5,8,7,2,1,3,7,6,3,8,4,3 };
int subarray[ 3 ] = { 3, 7, 6 };
int *found_it;
// find найти последнее вхождение последовательности 3,7,6
// в массив и вернуть адрес первого ее элемента ...
found_it = find_end( &array[0], &array[17],
&subarray[0], &subarray[3] );
assert( found_it == &array[10] );
vector int, allocator ivec( array, array+17 );
vector int, allocator subvec( subarray, subarray+3 );
vector int, allocator ::iterator found_it2;
found_it2 = find_end( ivec.begin(), ivec.end(),