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