STL算法总结之查找算法示例
Posted 学霸的一天
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STL算法总结之查找算法示例相关的知识,希望对你有一定的参考价值。
STL算法总结之查找算法示例
1.adjacent_find:
// 所有容器适用(线性的) adjacent_find(begin,end); adjacent_find(begin,end,Predicate);
在范围[first,last)之间寻找第一次出现的两个连续相等的元素,如果存在,则返回指向第一个元素迭代器,否则返回last.还可以使用自己定义的二元断言(就是自定义的判断方法)
#include<vector> #include<iostream> #include<stdio.h> #include<algorithm> using namespace std; /** 自定义的方法,判断的相等的条件是 i=j*2 */ bool myfunction (int i, int j){ return (i==j*2); } /** //所有容器适用(线性的) adjacent_find(b,e); adjacent_find(b,e,p); 在范围[first,last)之间寻找第一次出现的两个 连续相等的元素,如果存在,则返回指向第一个元素迭代器,否则返回last. 还可以使用自己定义的判断方法 */ int main(){ int myints[] = {10,20,30,30,40,20,10,20}; //将数组中的元素录入myvector vector<int> myvector (myints,myints+8); vector<int>::iterator it;//迭代器 printf("初始元素\n"); for(it=myvector.begin();it!=myvector.end();++it) cout<<*it<<" "; cout<<endl; //使用默认的比较方法 it = adjacent_find (myvector.begin(), myvector.end()); if (it!=myvector.end()) cout << "第一个连续的元素是: " << *it << endl; //使用自定义的比较方法 it = adjacent_find (myvector.begin(), myvector.end(), myfunction); if (it!=myvector.end()) cout << "第二个连续的元素是: " << *it << endl; return 0; } /***** Output 初始元素 10 20 30 30 40 20 10 20 第一个连续的元素是: 30 第二个连续的元素是: 40 */
2.binary_search和includes:
binary_search() //二分查找,返回bool值, binary_search(begin,end,value); binary_search(begin,end,value,cmp); includes() //包含查找,判断容器是否是包含关系,返回bool值。 includes(begin1,end1,begin2,end2); includes(begin1,end1,begin2,end2,cmp);binary_search():如果在[first,end)范围内存在任一元素和val相等,则返回true,
否则返回false.必须是已经排序的容器
includes():两个区间必须已经排序,判断区间1是否包含区间2,范围同样是[first,end)
#include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<algorithm> using namespace std; /** //所有容器适用(O(log(n))) 已序区间查找算法 binary_search() //二分查找,返回bool值, binary_search(begin,end,value); binary_search(begin,end,value,cmp); includes() //包含查找,判断容器是否是包含关系,返回bool值。 includes(begin1,end1,begin2,end2); includes(begin1,end1,begin2,end2,cmp); */ bool myfunction (int i,int j){ return (i<j); } int main(){ int myints[] = {1,2,3,4,5,4,3,2,1}; vector<int> v(myints,myints+9); // 1 2 3 4 5 4 3 2 1 //使用默认的比较 sort (v.begin(), v.end()); cout << "查找 3... "; if (binary_search (v.begin(), v.end(), 3)) cout << "发现!\n"; else cout << "没有发现.\n"; //使用自定义的比较 sort (v.begin(), v.end(), myfunction); cout << "查找 6... "; if (binary_search (v.begin(), v.end(), 6, myfunction)) cout << "发现!\n"; else cout << "没有发现.\n"; cout<<endl; /**----------------------------includes()容器包含查找---------------------------**/ int container[] = {5,15,10,25,20,35,30,50,45,40}; int continent[] = {40,30,20,10}; sort (container,container+10); sort (continent,continent+4); //使用默认的比较 if ( includes(container,container+10,continent,continent+4) ) cout << "容器container 包含容器continent!" << endl; //使用自定义的比较 if ( includes(container,container+10,continent,continent+4, myfunction) ) cout << "容器container 包含容器continent!" << endl; return 0; } /** Output 查找 3... 发现! 查找 6... 没有发现. 容器container 包含容器continent! 容器container 包含容器continent! */
3.count和count_if:
count: count (begin,end,value); count_if: count_if (begin,end,predicate); 关联容器的等效成员函数 set.count multiset.count map.count multimap.count
count:这个函数使用一对迭代器和一个值做参数,返回这个值出现次数的统计结果
count_if:返回区间中满足指定条件的元素数目
#include<iostream> #include<vector> #include<set> #include<algorithm> using namespace std; /** 奇数 */ bool IsOdd (int i){ return i&1; } int main(){ int mycount; // 数组计数元素 int myints[] = {10,20,30,30,20,10,10,20}; //8个元素 mycount = (int) count (myints, myints+8, 10); cout << "10 出现 " << mycount << " 次.\n"; //新建一个vector vector<int> myvector (myints, myints+8); mycount = (int) count (myvector.begin(), myvector.end(), 20);//有几个20 cout << "20 出现 " << mycount << " 次.\n"; /**************** Output: 10 出现 3 次. 20 出现 3 次. ****************/ //清除vector myvector.clear(); for (int i=1; i<10; i++) myvector.push_back(i); // myvector: 1 2 3 4 5 6 7 8 9 cout<<"\nmyvector: 1 2 3 4 5 6 7 8 9 \n"; // mycount = (int) count_if (myvector.begin(), myvector.end(), IsOdd); mycount = (int) count_if (myvector.begin(), myvector.end(), bind2nd(modulus<int>(),2));//表示param1 % 2 cout << "myvector 包含 " << mycount << " 奇数元素.\n";//奇数 // 如果求偶数的个数 not1,1表示一个参数取反 mycount = (int) count_if (myvector.begin(), myvector.end(), not1(bind2nd(modulus<int>(),2)));//表示!(param1 % 2) cout << "myvector 包含 " << mycount << " 偶数元素.\n";//偶数 /**************** Output: myvector 包含 5 奇数元素. ****************/ // 函数适配器 函数对象 // bind2nd(op,value);表示绑定第二个数 param1 > 4 这里表示统计大于4的个数 mycount=count_if(myvector.begin(),myvector.end(),bind2nd(greater<int>(),4)); cout<<"有"<<mycount<<"个数大于4"<<endl; //拓展练习 4 > param2 mycount=count_if(myvector.begin(),myvector.end(),bind1st(greater<int>(),4)); cout<<"有"<<mycount<<"个数小于4"<<endl; // 4 < param2 mycount=count_if(myvector.begin(),myvector.end(),bind1st(less<int>(),4)); cout<<"有"<<mycount<<"个数大于4"<<endl; // param1 >= 4 mycount=count_if(myvector.begin(),myvector.end(),bind2nd(greater_equal<int>(),4)); cout<<"有"<<mycount<<"个数大于等于4"<<endl; // param1 <= 4 mycount=count_if(myvector.begin(),myvector.end(),bind2nd(less_equal<int>(),4)); cout<<"有"<<mycount<<"个数小于等于4"<<endl; /****关联容器****/ multiset<int> ms(myvector.begin(),myvector.end()); ms.insert(myvector.begin(),myvector.begin()+6); ms.insert(myvector.begin(),myvector.begin()+4); ms.insert(myvector.begin(),myvector.begin()+2); ms.insert(1); multiset<int>::iterator ims=ms.begin(); while(ims!=ms.end()){ cout<<*ims++<<" "; }cout<<endl; //两种方法求1的个数 int cnt=count(ms.begin(),ms.end(),1);//所有容器适用但是比较慢些 cout<<"multiset里有"<<cnt<<"个1."<<endl; cnt=ms.count(1);//关联容器专享 set已经排序可以快速计数 cout<<"multiset里有"<<cnt<<"个1."<<endl; return 0; }
以上是关于STL算法总结之查找算法示例的主要内容,如果未能解决你的问题,请参考以下文章