Выбрать главу

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(),

subvec.begin(), subvec.end(),

equal_toint() );

assert( found_it2 == ivec.begin()+10 );

cout "ok: find_end правильно вернула начало "

"последнего вхождения последовательности: 3,7,6!\n";

}

Алгоритм find_first_of()

template class ForwardIterator1, class ForwardIterator2

ForwardIterator1

find_first_of( ForwardIterator1 first1, ForwardIterator1 last1,

ForwardIterator2 first2, ForwardIterator2 last2 );

template class ForwardIterator1, class ForwardIterator2,

class BinaryPredicate

ForwardIterator1

find_first_of( ForwardIterator1 first1, ForwardIterator1 last1,

ForwardIterator2 first2, ForwardIterator2 last2,

BinaryPredicate pred );

Последовательность, ограниченная парой [first2,last2), содержит элементы, поиск которых ведется в последовательности, ограниченной итераторами [first1,last1). Допустим, нужно найти первую гласную в последовательности символов synesthesia. Для этого определим вторую последовательность как aeiou. find_first_of() возвращает итератор, указывающий на первое вхождение любого элемента последовательности гласных букв, в данном случае e. Если же первая последовательность не содержит ни одного элемента из второй, то возвращается last1. В первом варианте используется оператор равенства, определенный для типа элементов контейнера, а во втором - бинарный предикат pred.

#include algorithm

#include vector

#include string

#include iostream.h

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_tostring() );

// печатает:

// тоже найдено: oo

// &svec.end()-2: 0x100067b0