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
- c++ primer 读书笔记之第十章 泛型算法
- C++primer(第五版)第十章 泛型算法
- 《C++primer(第五版)》学习之路-第十章:泛型算法
- C++Primer读书笔记(第十章)
- 读书笔记:C++primer plus第十章
- C++primer U11 读书笔记 泛型算法
- 菜狗的C++ primer读书笔记:第十章 泛型算法
- 《C++ Primer》读书笔记第十章-1-初识泛型算法 And Lambda
- 《C++ Primer》读书笔记第十章-2-再探迭代器 And 泛型算法结构
- 读书笔记《C++ Primer》第五版——第十章 泛型算法
- C++ Primer : 第十章 : 泛型算法 之 只读、写和排序算法
- C++ Primer :第十章 :泛型算法之再探迭代器以及其他算法
- c++primer(第五版) 第十章 泛型算法习题答案
- 2016/12/08C++Primer学习笔记:第十章 泛型算法
- 《C++primer(第五版)》学习笔记-第十章:泛型算法
- C++ Primer : 第十章 : 泛型算法 之 lambda表达式和bind函数
- 《C++Primer》读书笔记——第10章 泛型算法
- c++ primer 笔记,第十章(泛型算法)
- json问题积累(1)
- rabbitmq(三)
- the source attachment does not contain the source for the file xxx.class无法关联到某个类
- Linux下functions函数讲解
- 基本数据类型数据是放在栈还是常量池?
- c++ primer 读书笔记之第十章 泛型算法
- java基础之面向对象的继承
- XML总结(1)
- 剑指offer
- 【剑指offer】题20:顺时针打印矩阵
- JVM(7):JVM调优-工具篇
- linux内核启动流程
- pxe安装KS文件--实现优化IP分配
- c3p0的配置方式