c++ primer 读书笔记之第十章 泛型算法

来源:互联网 发布:windows xp精简版 编辑:程序博客网 时间:2024/06/06 01:18

c++的算法见algorithm.cpp和numeric.cpp文件中。泛型是指这些算法,适用于不同的容器类型,和容器元素类型。

算法1:查找一个元素中是否含有某元素:find

 
#include <iostream>#include <vector>#include <numeric>#include <algorithm>#include <string>using namespace std;
int main(){   vector<int> v={1,2,3}; auto index=find(v.cbegin(),v.cend(),4);   cout << (index==v.cend() ? "no exist" : "presence"); return 0;}

输出:

no exist

泛型算法分为三种:只读容器元素,写容器元素,重排容器元素

只读容器元素:

#include <iostream>#include <vector>#include <numeric>#include <algorithm>#include <string>using namespace std;int main(){   vector<string> v={"1","2","3"};   fill(v.begin(),v.end(),"a");   for(auto i=v.begin();i!=v.end();i++)   cout<<*i<<" ";    return 0;}

输出:

a a a 


例1:求得容器内指定范围内元素的和:accumulate(包含于头文件numeric.cpp)

#include <iostream>#include <vector>#include <numeric>#include <algorithm>#include <string>using namespace std;
int main(){vector<int> v={1,2,3};   int sum=accumulate(v.cbegin(),v.cend(),0);   cout << sum;    return 0;}

输出:

6

其中第三个参数是初值,它的数据类型告诉系统使用哪种类型的"+"。为什么要强调这一点,看下面一个例子:

#include <iostream>#include <vector>#include <numeric>#include <algorithm>#include <string>using namespace std;
int main(){vector<string> v={"1","2","3"};cout<<accumulate(v.cbegin(),v.cend(),string(""));    return 0;}

是0k的

但下面的写法就是不ok的。因为“”常量字符串的数据类型是const char * 。这种数据类型是没有+运算符的。

vector<string> v={"1","2","3"};cout<<accumulate(v.cbegin(),v.cend(),"");

例2:比较两个容器是否相等:equal(接受三个迭代器)
 vector<string> v={"1","2","3"};   vector<string> t={"1","2","3"};   cout<<equal(v.cbegin(),v.cend(),t.cbegin());

写容器元素:
例1:将序列指定范围中序列元素替代为某值:fill

#include <iostream>#include <vector>#include <numeric>#include <algorithm>#include <string>using namespace std;int main(){   vector<string> v={"1","2","3"};   fill(v.begin(),v.end(),"a");   for(auto i=v.begin();i!=v.end();i++)   cout<<*i<<" ";    return 0;}

例2:fill_n
  vector<string> v={"1","2","3"};  fill_n(v.begin(),3,"0");
例3:fill_n与back_inserter配合实现向一个空的容器插入元素
#include <iostream>#include <vector>#include <numeric>#include <algorithm>#include <string>using namespace std;int main(){   vector<string> v;  fill_n(back_inserter(v),3,"0");   for(auto i=v.begin();i!=v.end();i++)   cout<<*i<<" ";return 0;}
输出:
0 0 0 
例4:copy算法,适用于不想改变原序列的情况
#include <iostream>#include <vector>#include <numeric>#include <algorithm>#include <string>using namespace std;
int main(){   vector<string> v1={"1","2","3"}; vector<string> v2;   replace_copy(v1.cbegin(),v1.cend(),back_inserter(v2),"1","w");   cout<<"v1:"<<endl;   for(auto i=v1.begin();i!=v1.end();i++)    cout<<*i<<" "; cout<<endl<<"v2:"<<endl; for(auto i=v2.begin();i!=v2.end();i++)    cout<<*i<<" "; return 0;}
输出结果:
v1:1 2 3 v2:w 2 3 
注意:替代只可以相同大小的元素替代,例如“w”可以替代"1";但不可以"ww"来替代“1”

重排容器中元素
例1:去处容器中重复元素:sort(泛型算法)+unique(泛型算法)+erase(被容器对象所调用函数)

#include <iostream>#include <vector>#include <algorithm>#include <numeric>using namespace std;int main(){vector<int> v ={1,2,3,4,5,6,1,1,4,};    sort(v.begin(),v.end());auto beg=unique(v.begin(),v.end());v.erase(beg,v.end());for(auto it=v.begin();it!=v.end();it++){ cout<<*it;}   return 0;}
输出结果:
123456


注意1:unique的输入是有序的,实质上它执行的只是一个相邻重复元素的覆盖
注意2:unique返回的是一个迭代器








阅读全文
0 0
原创粉丝点击