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

       

Алгоритм 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";

}



Содержание раздела