您的位置:首页 > 其它

泛型算法系列22:search()&&search_n()

2009-08-17 15:13 411 查看
#include <algorithm>
#include <iostream>
#include <vector>
#include <functional>

using namespace std;

/************************************************************************/
/*                                                                      */
template<class _FwdIt1, class _Diff2, class _Ty, class _Pr> inline
_FwdIt1 my_search_n(_FwdIt1 _First1, _FwdIt1 _Last1,
_Diff2 _Count, const _Ty& _Val, _Pr _Pred)
{	// find first _Count * _Val match
_ASSIGN_FROM_BASE(_First1,
my_Search_n(_CHECKED_BASE(_First1), _CHECKED_BASE(_Last1), _Count, _Val,
_Pred, _Iter_cat(_First1)));
return _First1;
}

// TEMPLATE FUNCTION search_n WITH PRED
template<class _FwdIt1, class _Diff2, class _Ty, class _Pr> inline
_FwdIt1 my_Search_n(_FwdIt1 _First1, _FwdIt1 _Last1,
_Diff2 _Count, const _Ty& _Val, _Pr _Pred, forward_iterator_tag)
{	// find first _Count * _Val satisfying _Pred, forward iterators
_DEBUG_RANGE(_First1, _Last1);
_DEBUG_POINTER(_Pred);

if (_Count <= 0)
return (_First1);

for (; _First1 != _Last1; ++_First1)
if (_Pred(*_First1, _Val))
{	// found start of possible match, check it out
_FwdIt1 _Mid1  = _First1;

for (_Diff2 _Count1 = _Count; ; )
if (--_Count1 == 0)
return (_First1);	// found rest of match, report it
else if (++_Mid1 == _Last1)
return (_Last1);	// short match at end
else if (!_Pred(*_Mid1, _Val))
break;	// short match not at end

_First1 = _Mid1;	// pick up just beyond failed match
}
return (_Last1);
}
/************************************************************************/
int main()
{
ostream_iterator<char> ofile(cout, " ");
const char blank = ' ';
const char oh = 'o';

char str[26] = "oh my a mouse ate a moose";
char* found_it = search_n(str, str + 25, 2, oh);
cout << "Excepting to find two instances of o: ";
copy(found_it, found_it + 2, ofile);
cout << endl;

vector<char> vec(str, str + 25);
vector<char>::iterator iter;
iter = my_search_n(vec.begin(), vec.end(), 6, blank, not_equal_to<char>());
copy(iter, iter + 3, ofile);
cout << endl;

return 0;
}


#include <iostream>
#include <algorithm>
#include <vector>
#include <functional>
using namespace std;
/************************************************************************/
/*                                                                      */
template<class _FwdIt1,
class _FwdIt2> inline
_FwdIt1 my_search(_FwdIt1 _First1, _FwdIt1 _Last1,
_FwdIt2 _First2, _FwdIt2 _Last2)
{	// find first [_First2, _Last2) match
_ASSIGN_FROM_BASE(_First1,
my_Search(_CHECKED_BASE(_First1), _CHECKED_BASE(_Last1),
_CHECKED_BASE(_First2), _CHECKED_BASE(_Last2),
_Dist_type(_First1), _Dist_type(_First2)));
return _First1;
}

template<class _FwdIt1, class _FwdIt2, class _Diff1, class _Diff2> inline
_FwdIt1 my_Search(_FwdIt1 _First1, _FwdIt1 _Last1,
_FwdIt2 _First2, _FwdIt2 _Last2, _Diff1 *, _Diff2 *)
{	// find first [_First2, _Last2) match
_DEBUG_RANGE(_First1, _Last1);
_DEBUG_RANGE(_First2, _Last2);
_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))//else if (!_Pred(*_Mid1, *_Mid2))
break;
}
return (_Last1);
}
/************************************************************************/
int main()
{
ostream_iterator<char> ofile(cout," ");
char str[25] = "a fine and private place";
char substr[] = "ate";

char* found_it = my_search(str, str + 25, substr, substr + 3);
cout << "Expecting to find the substring ate:";
copy(found_it, found_it + 3, ofile);

vector<char> vec(str, str + 24);
vector<char> subVec(3);
subVec[0] = 'v';
subVec[1] = 'a';
subVec[2] = 't';
vector<char>::iterator iter;
iter = search(vec.begin(), vec.end(),
subVec.begin(), subVec.end(),
equal_to<char>());
cout << "Expecting to find the substring vat:";
copy(iter, iter + 3, ofile);
cout << endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: