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