Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C++ для начинающих.pdf
Скачиваний:
183
Добавлен:
01.05.2014
Размер:
3.97 Mб
Скачать

}

Алгоритм find()

template< class InputIterator, class T

>

InputIterator

find( InputIterator first,

InputIterator last, const T &value );

Элементы из диапазона, ограниченного парой итераторов [first,last), сравниваются со значением value с помощью оператора равенства, определенного для типа элементов контейнера. Как только соответствие найдено, поиск прекращается. find() возвращает итератор типа InputIterator, указывающий на найденный элемент; в

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

int main()

{

int array[ 17 ] =

{ 7,3,3,7,6,5,8,7,2,1,3,8,7,3,8,4,3 };

int elem = array[ 9 ]; int *found_it;

found_it = find( &array[0], &array[17], elem );

// печатается: поиск первого вхождения 1 найдено!

cout << "поиск первого вхождения "

<<elem << "\t"

<<( found_it ? "найдено!\n" : "не найдено!\n" );

string beethoven[] = {

"Sonata31", "Sonata32", "Quartet14", "Quartet15", "Archduke", "Symphony7" };

string s_elem( beethoven[ 1 ] );

list< string, allocator > slist( beethoven, beethoven+6 ); list< string, allocator >::iterator iter;

iter = find( slist.begin(), slist.end(), s_elem );

// печатается: поиск первого вхождения Sonata32 найдено!

cout << "поиск первого вхождения "

<<s_elem << "\t"

<<( found_it ? "найдено!\n" : "не найдено!\n" );

противном случае возвращается last.

}

Алгоритм find_if()

template< class InputIterator, class Predicate

>

InputIterator

find_if( InputIterator first,

InputIterator last, Predicate pred );

К каждому элементу из диапазона [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, less<string>, allocator > friendset;

};

set< string, less<string>, allocator > OurFriends::friendset;

int main()

{

string Pooh_friends[] = { "Пятачок", "Тигра", "Иа-Иа" }; string more_friends[] = { "Квазимодо", "Чип", "Пятачок" }; list<string,allocator> lf( more_friends, more_friends+3 );

// заполнить список друзей Пуха OurFriends::FriendSet( Pooh_friends, 3 );

list<string,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_to<int>() );

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

cout << "ok: find_end правильно вернула начало " << "последнего вхождения последовательности:

3,7,6!\n";

контейнера, а во втором – бинарный предикат, переданный пользователем.

}