源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

浅析STL中的常用算法

  • 时间:2022-08-23 21:46 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:浅析STL中的常用算法
[b]一、非变异算法[/b] 是一组不破坏操作数据的模板函数,用来对序列数据进行逐个处理、元素查找、子序列搜索、统计和匹配。非变异算法具有极为广泛的适用性,基本上可应用与各种容器。 [b]1查找容器元素find[/b] 它用于查找等于某值的元素。它在迭代器区间[first,last)(闭开区间)上查找等于value值的元素,如果迭代器i所指的元素满足*i=value,则返回迭代器i;未找到满足条件的元素,返回last。函数原型:find( v1.begin(), v1.end(), num_to_find );
[u]复制代码[/u] 代码如下:
#include <vector> #include <algorithm> #include <iostream> using namespace std; void main() { int num_to_find = 6; vector<int> v1; for( int i = 0; i < 10; i++ ) v1.push_back(2*i); vector<int>::iterator result; result = find( v1.begin(), v1.end(), num_to_find ); if( result == v1.end() ) cout << "未找到任何元素匹配 " << num_to_find << endl; else cout << "匹配元素的索引值是 " << result-v1.begin() << endl; }
[b]2条件查找容器元素find_if[/b] 利用返回布尔值的谓词判断pred,检查迭代器区间[first,last)(闭开区间)上的每一个元素,如果迭代器i满足pred(*i)=true,表示找到元素并返回迭代值i(找到的第一个符合条件的元素);未找到元素,返回末位置last。函数原型:find_if(v.begin(),v.end(),divby5);
[u]复制代码[/u] 代码如下:
#include <vector> #include <algorithm> #include <iostream> using namespace std; bool divby5(int x) { return x%5?0:1; } void main() { vector<int> v(20); for(int i=0;i<v.size();i++) { v[i]=(i+1)*(i+3); cout<<v[i]<<' '; } cout<<endl; vector<int>::iterator ilocation; ilocation=find_if(v.begin(),v.end(),divby5); if(ilocation!=v.end()) cout<<"找到第一个能被5整除的元素:"<<*ilocation<<endl<<"元素的索引位置是: "<<ilocation-v.begin()<<endl; }
[b]3统计等于某值的容器元素个数count[/b] list<int> l; count(l.begin(),l.end(),value) 4条件统计count_if count_if(l.begin(),l.end(),pred)。谓词pred含义同find_if中的谓词。例子可以参考例2. 5子序列搜索search search算法函数在一个序列中搜索与另一序列匹配的子序列。参数分别为一个序列的开始位置,结束位置和另一个序列的开始,结束位置。 函数原型:search(v1.begin(),v1.end(),v2.begin(),v2.end());
[u]复制代码[/u] 代码如下:
#include <vector> #include <algorithm> #include <iostream> using namespace std; void main() { vector<int> v1; cout<<"v1:"; for(int i=0;i<5;i++) { v1.push_back(i+5); //注意:v1定义时没有给定大小,因此这里不能直接使用赋值语句。 cout<<v1[i]<<' '; } cout<<endl; vector<int> v2; cout<<"v2:"; for(i=0;i<2;i++) { v2.push_back(i+7); cout<<v2[i]<<' '; } cout<<endl; vector<int>::iterator ilocation; ilocation=search(v1.begin(),v1.end(),v2.begin(),v2.end()); if(ilocation!=v1.end()) cout<<"v2的元素包含在v1中,起始元素为"<<"v1["<<ilocation-v1.begin()<<']'<<endl; else cout<<"v2的元素不包含在v1中"<<endl; }
6重复元素子序列搜索search_n search_n算法函数搜索序列中是否有一系列元素值均为某个给定值的子序列。函数原型:search_n(v.begin(),v.end(),3,8),在v中找到3个连续的元素8
[u]复制代码[/u] 代码如下:
#include <vector> #include <algorithm> #include <iostream> using namespace std; void main() { vector<int> v; v.push_back(1); v.push_back(8); v.push_back(8); v.push_back(8); v.push_back(6); v.push_back(6); v.push_back(8); vector<int>::iterator i; i=search_n(v.begin(),v.end(),3,8); if(i!=v.end()) cout<<"在v中找到3个连续的元素8"<<endl; else cout<<"在v中未找到3个连续的元素8"<<endl; }
7最后一个子序列搜索find_end 函数原型find_end(v1.begin(),v1.end(),v2.begin(),v2.end());在V1中要求的位置查找V2中要求的序列。
[u]复制代码[/u] 代码如下:
#include <vector> #include <algorithm> #include <iostream> using namespace std;   void main() { vector<int> v1; v1.push_back(-5); v1.push_back(1); v1.push_back(2); v1.push_back(-6); v1.push_back(-8); v1.push_back(1); v1.push_back(2); v1.push_back(-11); vector<int> v2; v2.push_back(1); v2.push_back(2); vector<int>::iterator i; i=find_end(v1.begin(),v1.end(),v2.begin(),v2.end()); if(i!=v1.end()) cout<<"v1中找到最后一个匹配v2的子序列,位置在" <<"v1["<<i-v1.begin()<<"]"<<endl; }
[b]二、变异算法[/b] 是一组能够修改容器元素数据的模板函数。copy(v.begin(),v.end(),l.begin());将v中的元素复制到l中。 [b]1 元素复制copy [/b]
[u]复制代码[/u] 代码如下:
#include <vector> #include <list> #include <algorithm> #include <iostream> using namespace std; void main() { vector<int> v; v.push_back(1); v.push_back(3); v.push_back(5);   list<int> l; l.push_back(2); l.push_back(4); l.push_back(6); l.push_back(8); l.push_back(10); copy(v.begin(),v.end(),l.begin()); list<int>::iterator i; for(i=l.begin();i!=l.end();i++) cout<<*i<<' '; cout<<endl; }
[b]2 元素变换transform改变[/b] 函数原型:transform(v.begin(),v.end(),l.begin(),square);也是复制,但是要按某种方案复制。
[u]复制代码[/u] 代码如下:
#include <vector> #include <list> #include <algorithm> #include <iostream> using namespace std;   int square(int x) { return x*x; } void main() { vector<int> v; v.push_back(5); v.push_back(15); v.push_back(25); list<int> l(3); transform(v.begin(),v.end(),l.begin(),square); list<int>::iterator i; for(i=l.begin();i!=l.end();i++) cout<<*i<<' '; cout<<endl; }
[b]3 替换replace[/b] replace算法将指定元素值替换为新值。
[u]复制代码[/u] 代码如下:
#include <vector> #include <algorithm> #include <iostream> using namespace std; void main() { vector<int> v; v.push_back(13); v.push_back(25); v.push_back(27); v.push_back(25); v.push_back(29); replace(v.begin(),v.end(),25,100); vector<int>::iterator i; for(i=v.begin();i!=v.end();i++) cout<<*i<<' '; cout<<endl; }
输出结果为13 100 27 100 29 [b]4 条件替换replace_if[/b] 函数原型:replace_if(v.begin(),v.end(),odd,100);
[u]复制代码[/u] 代码如下:
#include <vector> #include <algorithm> #include <iostream> using namespace std; bool odd(int x) { return x%2; } void main() { vector<int> v; for(int i=1;i<10;i++) v.push_back(i); replace_if(v.begin(),v.end(),odd,100); vector<int>::iterator ilocation; for(ilocation=v.begin();ilocation!=v.end();ilocation++) cout<<*ilocation<<' '; cout<<endl; }
[b]5 n次填充fill_n[/b] 函数原型fill_n(v.begin(),5,-1);向从v.begin开始的后面5个位置跳入-1
[u]复制代码[/u] 代码如下:
#include <vector> #include <algorithm> #include <iostream> using namespace std; void main() { vector<int> v(10); fill_n(v.begin(),5,-1); vector<int>::iterator ilocation; for(ilocation=v.begin();ilocation!=v.end();ilocation++) cout<<*ilocation<<' '; cout<<endl; }
输出结果:-1 -1 -1 -1 -1 0 0 0 0 0 [b]6 随机生成n个元素generate[/b] 函数原型:generate_n(v.begin(),5,rand);向从v.begin开始的后面5个位置随机填写数据。
[u]复制代码[/u] 代码如下:
#include <vector> #include <algorithm> #include <iostream> using namespace std; void main() { vector<int> v(10); generate_n(v.begin(),5,rand); vector<int>::iterator ilocation; for(ilocation=v.begin();ilocation!=v.end();ilocation++) cout<<*ilocation<<' '; cout<<endl; }
[b]7 条件移除remove_if[/b] 返回值相当于移除满足条件的元素后形成的新向量的end()值。 函数原型:remove_if(v.begin(),v.end(),even);
[u]复制代码[/u] 代码如下:
#include <vector> #include <algorithm> #include <iostream> using namespace std; bool even(int x) { return x%2?0:1; } void main() { vector<int> v; for(int i=1;i<=10;i++) v.push_back(i); vector<int>::iterator ilocation,result; cout<<"移除前:"; for(ilocation=v.begin();ilocation!=v.end();ilocation++) cout<<*ilocation<<' '; cout<<endl; result=remove_if(v.begin(),v.end(),even); cout<<"移除后:"; for(ilocation=v.begin();ilocation!=result;ilocation++) cout<<*ilocation<<' '; cout<<endl; }
[b]8 剔除连续重复元素unique[/b] 函数原型:unique(v.begin(),v.end());
[u]复制代码[/u] 代码如下:
#include <vector> #include <algorithm> #include <iostream> using namespace std; void main() { vector<int> v; v.push_back(2); v.push_back(6); v.push_back(6); v.push_back(6); v.push_back(9); v.push_back(6); v.push_back(3); vector<int>::iterator ilocation,result; result=unique(v.begin(),v.end()); for(ilocation=v.begin();ilocation!=result;ilocation++) cout<<*ilocation<<' '; cout<<endl; }
输出结果:2 6 9 6 3 [b]三、排序算法[/b] 1、创建堆make_heap 2、元素入堆push_heap(默认插入最后一个元素) 3、元素出堆pop_heap(与push_heap一样,pop_heap必须对堆操作才有意义)
[u]复制代码[/u] 代码如下:
#include <vector> #include <algorithm> #include <iostream> using namespace std; void main() { vector<int> v; v.push_back(5); v.push_back(6); v.push_back(4); v.push_back(8); v.push_back(2); v.push_back(3); v.push_back(7); v.push_back(1); v.push_back(9); make_heap(v.begin(),v.end()); v.push_back(20); push_heap(v.begin(),v.end()); vector<int>::iterator ilocation; for(ilocation=v.begin();ilocation!=v.end();ilocation++) cout<<*ilocation<<' '; cout<<endl; pop_heap(v.begin(),v.end()); for(ilocation=v.begin();ilocation!=v.end();ilocation++) cout<<*ilocation<<' '; cout<<endl; }
[b]4 堆排序sort_heap[/b] 使用:
[u]复制代码[/u] 代码如下:
make_heap(v.begin(),v.end()); sort_heap(v.begin(),v.end()); #include <vector> #include <algorithm> #include <iostream> using namespace std; void main() { vector<int> v; v.push_back(3); v.push_back(9); v.push_back(6); v.push_back(3); v.push_back(17); v.push_back(20); v.push_back(12); vector<int>::iterator ilocation; for(ilocation=v.begin();ilocation!=v.end();ilocation++) cout<<*ilocation<<' '; cout<<endl; make_heap(v.begin(),v.end()); sort_heap(v.begin(),v.end()); for(ilocation=v.begin();ilocation!=v.end();ilocation++) cout<<*ilocation<<' '; cout<<endl; }
输出结果: 3 9 6 3 17 20 12 3 3 6 9 12 17 20 [b]5 排序sort[/b] 函数原型:sort(v.begin(),v.end());
[u]复制代码[/u] 代码如下:
#include <vector> #include <algorithm> #include <iostream> using namespace std; void main() { vector<int> v; v.push_back(2); v.push_back(8); v.push_back(-15); v.push_back(90); v.push_back(26); v.push_back(7); v.push_back(23); v.push_back(30); v.push_back(-27); v.push_back(39); v.push_back(55); vector<int>::iterator ilocation; for(ilocation=v.begin();ilocation!=v.end();ilocation++) cout<<*ilocation<<' '; cout<<endl; sort(v.begin(),v.end());//比较函数默认 for(ilocation=v.begin();ilocation!=v.end();ilocation++) cout<<*ilocation<<' '; cout<<endl; }
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部