STL_算法_查找算法(search、find_end)
2015-12-24 22:14
399 查看
C++ Primer 学习中。。。
简单记录下我的学习过程 (代码为主)
search //从左往右找第一个符合条件的子区间 所有容器适用
find_end
//从右往左找第一个符合条件的子区间 所有容器适用
#include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<list> #include<deque> #include<algorithm> using namespace std; /************************************************************************************* std::search 从左往右找子区间 所有容器适用 algorithm -------------------------------------------------------------------------------------- template <class ForwardIterator1, class ForwardIterator2> ForwardIterator1 search ( ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2 ); template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> ForwardIterator1 search ( ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2. BinaryPredicate pred ); eg: template<class ForwardIterator1, class ForwardIterator2> ForwardIterator1 search ( ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2) { if (first2==last2) return first1; // specified in C++11 while (first1!=last1) { ForwardIterator1 it1 = first1; ForwardIterator2 it2 = first2; while (*it1==*it2) // or: while (pred(*it1,*it2)) for the pred version { ++it1; ++it2; if (it2==last2) return first1; if (it1==last1) return last1; } ++first1; } return last1; } **************************************************************************************/ /************************************************************************************* std::find_end 从右往左找子区间 所有容器适用 algorithm -------------------------------------------------------------------------------------- template <class ForwardIterator1, class ForwardIterator2> ForwardIterator1 find_end ( ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2 ); template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> ForwardIterator1 find_end ( ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred ); eg: template<class ForwardIterator1, class ForwardIterator2> ForwardIterator1 find_end ( ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2) { if (first2==last2) return last1; // specified in C++11 ForwardIterator1 ret = last1; while (first1!=last1) { ForwardIterator1 it1 = first1; ForwardIterator2 it2 = first2; while (*it1==*it2) // or: while (pred(*it1,*it2)) for the pred version { ++it1; ++it2; if (it2==last2) { ret=first1; break; } if (it1==last1) return ret; } ++first1; } return ret; } **************************************************************************************/ bool mypredicate (int i, int j) { return (i==j); } bool myfunction (int i, int j) { return (i==j); } bool check(int elem,bool bo)//二元谓词 { if(bo) return !(elem&1); else return elem&1; } int main () { vector<int> myvector; vector<int>::iterator it; // set some values: myvector: 10 20 30 40 50 60 70 80 90 for (int i=1; i<10; i++) myvector.push_back(i*10); // using default comparison: int match1[] = {40,50,60,70}; it = search (myvector.begin(), myvector.end(), match1, match1+4); if (it!=myvector.end()) cout << "match1 found at position " << int(it-myvector.begin()) << endl; else cout << "match1 not found" << endl; // using predicate comparison: int match2[] = {20,30,50}; it = search (myvector.begin(), myvector.end(), match2, match2+3, mypredicate); if (it!=myvector.end()) cout << "match2 found at position " << int(it-myvector.begin()) << endl; else cout << "match2 not found" << endl; /**--------------------------------------find_end-----------------------------------------**/ int myints[] = {1,2,3,4,5,1,2,3,4,5,1}; deque<int> mydeque (myints,myints+11); deque<int>::iterator itd; int match3[] = {1,2,3}; // using default comparison: itd = find_end (mydeque.begin(), mydeque.end(), match3, match3+3); if (itd!=mydeque.end()) cout << "match1 last found at position " << int(itd-mydeque.begin()) << endl; int match4[] = {4,5,1}; // using predicate comparison: itd = find_end (mydeque.begin(), mydeque.end(), match4, match4+3, myfunction); if (itd!=mydeque.end()) cout << "match2 last found at position " << int(itd-mydeque.begin()) << endl; /**--------------------------拓展找:偶数奇数奇数------------------------------**/ cout<<"\n1 2 3 4 5 1 2 3 4 5 1"<<endl; vector<int> vec(myints,myints+11); bool checkEven[3]={true,false,false}; //search it=search(vec.begin(),vec.end(),checkEven,checkEven+3,check); //find_end itd=find_end(mydeque.begin(),mydeque.end(),checkEven,checkEven+3,check); if (it!=vec.end()) cout << " even odd odd found at position " << int(it-vec.begin()) << endl; else cout << "not found" << endl; if (itd!=mydeque.end()) cout << " even odd odd found at position " << int(itd-mydeque.begin()) << endl; else cout << "not found" << endl; return 0; } /****** Output: match1 found at position 3 match2 not found match1 last found at position 5 match2 last found at position 3 1 2 3 4 5 1 2 3 4 5 1 even odd odd found at position 3 even odd odd found at position 8 ******/
相关文章推荐
- Texmacs中文支持
- excel表如何导入PL/SQL,从excel中生成一千万条记录
- android解决ScrollView嵌套ListView不能下拉刷新
- Wireshark提取RTP包中的H264码流
- Python爬虫 - 登录csdn
- SHFileOperation DeleteFolder
- 鼠标消息与键盘消息
- 扫描
- NFC手机识别身份证的技术实现思路
- 分页技术
- linux软件包管理之一(rpm包管理)
- 使用Pycharm安装Python第三方库
- POJ-1456 Supermarket(贪心,并查集优化)
- Hibernate基本特性二 -- 一级缓存
- Activity启动模式
- POJ-1456 Supermarket(贪心,并查集优化)
- C字符串
- fork系统调用
- Java+MySQL实现网络爬虫程序
- 第三十八课 用break和continue改变流程 【项目1-2】