mismatch详解

41 篇文章 0 订阅
39 篇文章 2 订阅

 

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>,如果程序没有找到相异点,并不能说明两个序列相等.因为可能第二序列长度大于第一序列长度.在调用的时候,一定要确保第二序列有足够的元素.

另外第二个函数需要的是使得_Predfalse.这与一般函数的要求不同

举例:

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(),但是两个序列并不相等.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值