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

       

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

   list< int, allocator > ilist2( ia2, ia2+9 );

                 

   // печатается: список ilist равен ilist2? Да.

   res = equal( ilist.begin(), ilist.end(), ilist2.begin() );

   cout << "список ilist равен ilist2? "

        << ( res ? "Да" : "Нет" ) << ".\n";

   // false: 0, 2, 8 не являются равными и нечетными

   // печатается: список ilist equal_and_odd() ilist2? Нет.

   res = equal( ilist.begin(), ilist.end(),

                       ilist2.begin(), equal_and_odd() );

   cout << "список ilist equal_and_odd() ilist2? "

        << ( res ? "Да" : "Нет" ) << ".\n";

                 

   return 0;

}



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