泛型算法系列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; }
相关文章推荐
- 【量化小讲堂-Python&Pandas系列22】最优雅的Python编程方式:Jupyter Notebook视频教程
- 泛型算法系列5:lower_bound()&&upper_bound()
- elasticsearch系列一:elasticsearch(ES简介、安装&配置、集成Ikanalyzer)
- 【Leetcode长征系列】Search in Rotated Sorted Array I & II
- 泛型算法系列9:count()&&count_if()
- 泛型算法系列14:random_shuffle()&&iter_swap()&&swap()
- 泛型算法系列20:reverse()&&reverse_copy()
- 泛型算法系列27:next_permutation()&&prev_permutation()
- 泛型算法系列6:find()&&find_if()
- 泛型算法系列16:max()&&min()&&min_element()&&max_element()
- 泛型算法系列18:remove()&&remove_copy()
- 泛型算法系列21:retate()&&retate_copy()
- 泛型算法系列19:remove_if()&&remove_copy_if()
- 泛型算法系列29:unique()&&unique_copy()
- 泛型算法系列4:binary_search()
- 泛型算法系列12:fill()&&fill_n()
- 泛型算法系列28:partial_sort()&&partial_sort_copy()&&partial_sum()
- 泛型算法系列33:merge()&&inplace_merge()
- 泛型算法系列35:set_difference()&&set_intersection()&&set_symmetric_difference()&&set_union()
- 泛型算法系列17:generate_n()&&generate()