Алгоритм mismatch()
template< class InputIterator1, class InputIterator2 >
pair<InputIterator1, InputIterator2>
mismatch( InputIterator1 first,
InputIterator1 last, InputIterator2 first2 );
template< class InputIterator1, class InputIterator2,
class BinaryPredicate >
pair<InputIterator1, InputIterator2>
mismatch( InputIterator1 first, InputIterator1 last,
InputIterator2 first2, BinaryPredicate pred );
mismatch() сравнивает две последовательности и находит первую позицию, где элементы различны. Возвращается пара итераторов, каждый из которых указывает на эту позицию в соответствующей последовательности. Если все элементы одинаковы, то каждый итератор в паре указывает на элемент last в своем контейнере. Так, если даны последовательности meet и meat, то оба итератора указывают на третий элемент. В первом варианте для сравнения элементов применяется оператор равенства, а во втором – операция сравнения, заданная пользователем. Если вторая последовательность длиннее первой, “лишние” элементы игнорируются; если же она короче, то поведение программы не определено.
#include <algorithm>
#include <list>
#include <utility>
#include <iostream.h>
class equal_and_odd{
public:
bool operator()( int ival1, int ival2 )
{
// оба значения равны друг другу?
// оба равны нулю? оба нечетны?
return ( ival1 == ival2 &&
( ival1 == 0 || ival1%2 ));
}
};
int main()
{
int ia[] = { 0,1,1,2,3,5,8,13 };
int ia2[] = { 0,1,1,2,4,6,10 };
pair<int*,int*> pair_ia = mismatch( ia, ia+7, ia2 );
// печатается: первая пара неодинаковых: ia: 3 и ia2: 4
cout << "первая пара неодинаковых: ia: "
<< *pair_ia.first << " и ia2: "
<< *pair_ia.second << endl;
list<int,allocator> ilist( ia, ia+7 );
list<int,allocator> ilist2( ia2, ia2+7 );
typedef list<int,allocator>::iterator iter;
pair<iter,iter> pair_ilist =
mismatch( ilist.begin(), ilist.end(),
ilist2.begin(), equal_and_odd() );
// печатается: первая пара неодинаковых: либо не равны, либо не нечетны:
// ilist: 2 и ilist2: 2
cout << "первая пара неодинаковых: либо не равны, "
<< "либо не нечетны: \n\tilist: "
<< *pair_ilist.first << " и ilist2: "
<< *pair_ilist.second << endl;
}