search详解

来源:岁月联盟 编辑:exp 时间:2012-05-05
search算法:
                   //TEMPLATE FUNCTION search
template<class_FwdIt1,
         class_FwdIt2,
         class_Diff1,
         class_Diff2> inline
         _FwdIt1 _Search(_FwdIt1 _First1,_FwdIt1 _Last1,
                   _FwdIt2 _First2, _FwdIt2_Last2, _Diff1 *, _Diff2 *)
         {       // find first [_First2, _Last2) match
         _Diff1 _Count1 = 0;
         _Distance(_First1, _Last1, _Count1);//获取父序列大小
         _Diff2 _Count2 = 0;
         _Distance(_First2, _Last2, _Count2);//获取子序列大小
 
         for (;_Count2 <= _Count1; ++_First1, --_Count1)
                   {       // room for match, try it
//保存一个中间变量,使得父序列可以和子序列依次对比而不影响外层循环的父迭代器
                  _FwdIt1 _Mid1= _First1;
                   for(_FwdIt2 _Mid2 = _First2; ; ++_Mid1, ++_Mid2)
                            if (_Mid2 == _Last2)//如果子序列已经比较完成,则表明查找完成.
                                     return (_First1);
                            else if (!(*_Mid1 ==*_Mid2))//如果不等进行下次外循环
                                     break;
                            //else (*_Mid1 ==*Mid2 ) 继续内循环
                   }
         return(_Last1);
         }
 
template<class_FwdIt1,
         class_FwdIt2> inline
         _FwdIt1 search(_FwdIt1 _First1, _FwdIt1_Last1,
                   _FwdIt2 _First2, _FwdIt2_Last2)
         {       // find first [_First2, _Last2) match
         _DEBUG_RANGE(_First1, _Last1);
         _DEBUG_RANGE(_First2, _Last2);
         return(_Rechecked(_First1,
                   _Search(_Unchecked(_First1),_Unchecked(_Last1),
                            _Unchecked(_First2),_Unchecked(_Last2),
                            _Dist_type(_First1),_Dist_type(_First2))));
         }
其中:_Dist_type返回两指针的距离的类型
重载search:
                   //TEMPLATE FUNCTION search WITH PRED
template<class_FwdIt1,
         class_FwdIt2,
         class_Diff1,
         class_Diff2,
         class_Pr> inline
         _FwdIt1 _Search(_FwdIt1 _First1,_FwdIt1 _Last1,
                   _FwdIt2 _First2, _FwdIt2_Last2, _Pr _Pred, _Diff1 *, _Diff2 *)
         {       // find first [_First2, _Last2) satisfying _Pred
         _Diff1 _Count1 = 0;
         _Distance(_First1, _Last1, _Count1);
         _Diff2 _Count2 = 0;
         _Distance(_First2, _Last2, _Count2);
 
         for (;_Count2 <= _Count1; ++_First1, --_Count1)
                   {       // room for match, try it
                   _FwdIt1 _Mid1 = _First1;
                   for(_FwdIt2 _Mid2 = _First2; ; ++_Mid1, ++_Mid2)
                            if (_Mid2 == _Last2)
                                     return (_First1);
                            else if(!_Pred(*_Mid1, *_Mid2))
                                     break;
                   }
         return(_Last1);
         }
 
template<class_FwdIt1,
         class_FwdIt2,
         class_Pr> inline
         _FwdIt1 search(_FwdIt1 _First1, _FwdIt1_Last1,
                   _FwdIt2 _First2, _FwdIt2_Last2, _Pr _Pred)
         {       // find first [_First2, _Last2) satisfying _Pred
         _DEBUG_RANGE(_First1, _Last1);
         _DEBUG_RANGE(_First2, _Last2);
         _DEBUG_POINTER(_Pred);
         return(_Rechecked(_First1,
                   _Search(_Unchecked(_First1),_Unchecked(_Last1),
                            _Unchecked(_First2),_Unchecked(_Last2), _Pred,
                            _Dist_type(_First1),_Dist_type(_First2))));
         }
有了第一个函数作为基础,第二个函数就容易理解多了.
需要注意的是,函数返回父迭代器.
举例:
template<typenameT>
bool equal_three( T _value1,T _value2 )
{
         return_value1 == ++ _value2;
}
int main()
{
         vector<int>vecInt;
         vecInt.push_back( 2 );
         vecInt.push_back( 5 );
         vecInt.push_back( 7 );
         vecInt.push_back( 3 );
         vecInt.push_back( 5 );
         vecInt.push_back( 4 );
         vecInt.push_back( 5 );
         vecInt.push_back( -17 );
         vecInt.push_back( 3 );
 
         list<int>lstInt;
         lstInt.push_back( 2 );
         lstInt.push_back( 4 );
         lstInt.push_back( 3 );
         vector<int>::iteratoriterFind = search(vecInt.begin(),vecInt.end(),lstInt.begin(),lstInt.end(),equal_three<int> );
         if (iterFind != vecInt.end() )
         {
                   copy( iterFind,iterFind +lstInt.size(),ostream_iterator<int>(cout," " ) );
         }
         cout<<"/n";
         iterFind = search( vecInt.begin(),vecInt.end(),lstInt.begin(),lstInt.end());
         if (iterFind != vecInt.end() )
         {
                   copy( iterFind,iterFind +lstInt.size(),ostream_iterator<int>(cout," " ) );
         }
         system( "pause");
         return0;
}
3 5 4
         请按任意键继续...



摘自 yuanweihuayan的专栏