mismatch:搜寻两区间第一处不同点.
template<class _InIt1,
class _InIt2> inline
pair<_InIt1, _InIt2>
mismatch(_InIt1 _First1, _InIt1 _Last1,
_InIt2 _First2)
{ // return [_First1, _Last1)/[_First2, ...) mismatch
_DEBUG_RANGE(_First1, _Last1);
_DEBUG_POINTER(_First2);
_STD pair<_UNCHECKED_TYPE(_InIt1), _InIt2> _Ans(
_STD _Mismatch1(_Unchecked(_First1), _Unchecked(_Last1),
_First2, _Is_checked(_First2)));
return (_STD pair<_InIt1, _InIt2>(
_Rechecked(_First1, _Ans.first),
_Ans.second));
}
template<class _InIt1,
class _InIt2> inline
pair<_InIt1, _InIt2>
_Mismatch1(_InIt1 _First1, _InIt1 _Last1,
_InIt2 _First2, _STD tr1::true_type)
{ // return [_First1, _Last1)/[_First2, ...) mismatch, checked input
return (_STD _Mismatch(_First1, _Last1,
_First2));
}
// TEMPLATE FUNCTION mismatch
template<class _InIt1,
class _InIt2> inline
pair<_InIt1, _InIt2>
_Mismatch(_InIt1 _First1, _InIt1 _Last1,
_InIt2 _First2)
{ // return [_First1, _Last1)/[_First2, ...) mismatch
for (; _First1 != _Last1 && *_First1 == *_First2; )//此处循环判断[_First-_Last1)与[_First2,...)
++_First1, ++_First2;//这里又出现了逗号表达式.当然了.取值在这里没有太大的意义
return (pair<_InIt1, _InIt2>(_First1, _First2));
}
mismatch:搜寻两区间第一处使得_Pred为false的对应元素.
template<class _InIt1,
class _InIt2,
class _Pr> inline
pair<_InIt1, _InIt2>
mismatch(_InIt1 _First1, _InIt1 _Last1,
_InIt2 _First2, _Pr _Pred)
{ // return [_First1, _Last1)/[_First2, ...) mismatch using _Pred
_DEBUG_RANGE(_First1, _Last1);
_DEBUG_POINTER(_First2);
_DEBUG_POINTER(_Pred);
_STD pair<_UNCHECKED_TYPE(_InIt1), _InIt2> _Ans(
_STD _Mismatch2(_Unchecked(_First1), _Unchecked(_Last1),
_First2, _Pred, _Is_checked(_First2)));
return (_STD pair<_InIt1, _InIt2>(
_Rechecked(_First1, _Ans.first),
_Ans.second));
}
template<class _InIt1,
class _InIt2,
class _Pr> inline
pair<_InIt1, _InIt2>
_Mismatch2(_InIt1 _First1, _InIt1 _Last1,
_InIt2 _First2, _Pr _Pred, _STD tr1::true_type)
{ // return [_First1, _Last1)/[_First2, ...) mismatch, checked input
return (_STD _Mismatch(_First1, _Last1,
_First2, _Pred));
}
// TEMPLATE FUNCTION mismatch WITH PRED
template<class _InIt1,
class _InIt2,
class _Pr> inline
pair<_InIt1, _InIt2>
_Mismatch(_InIt1 _First1, _InIt1 _Last1,
_InIt2 _First2, _Pr _Pred)
{ // return [_First1, _Last1)/[_First2, ...) mismatch using _Pred
for (; _First1 != _Last1 && _Pred(*_First1, *_First2); )
++_First1, ++_First2;
return (pair<_InIt1, _InIt2>(_First1, _First2));
}
需要注意的是函数返回pair<_InIt1,_InIt2>,如果程序没有找到相异点,并不能说明两个序列相等.因为可能第二序列长度大于第一序列长度.在调用的时候,一定要确保第二序列有足够的元素.
另外第二个函数需要的是使得_Pred为false.这与一般函数的要求不同
举例:
1. template<typename T>
2. bool mismatch_fun( T _value1,T _value2 )
3. {
4. return _value2 % _value1 == 0;
5. }
6. int main()
7. {
8. vector<int> vecInt;
9. vecInt.push_back( 3 );
10. vecInt.push_back( 6 );
11. vecInt.push_back( 5 );
12.
13. list<int> lstInt;
14. lstInt.push_back( 3 );
15. lstInt.push_back( 12 );
16. lstInt.push_back( 10 );
17. lstInt.push_back( 6 );
18. pair<vector<int>::iterator,list<int>::iterator > val = mismatch( vecInt.begin(),vecInt.end(),lstInt.begin() );
19. if ( val.first != vecInt.end() )
20. {
21. cout<<"vecInt value:"<<*val.first<<" lstInt value:"<<*val.second<<"\n";
22. }
23. val = mismatch( vecInt.begin(),vecInt.end(),lstInt.begin(),mismatch_fun<int> );
24. if ( val.first != vecInt.end() )
25. {
26. cout<<"vecInt value:"<<*val.first<<" lstInt value:"<<*val.second<<"\n";
27. }
28. system( "pause" );
29. return 0;
30. }
31.
函数输出:
vecInt value:6 lstInt value:12
说明:23行代码取得的first值为vecInt.end(),但是两个序列并不相等.