泛型算法 Generic Algorithm
常用
- find
- find_if 传递谓词,找到第一个符合条件的
- count 查找元素出现的次数
- count_if
- accumulate 求和,numeric头中,传入范围,和的初始值
- equal 比较两个序列是否相同
- fill 填充
- copy
- replace 替换元素
- replace_copy 替换元素,不改变原序列,结果输出到另一个序列
- (很多算法都有copy版本)
- sort 排序
- stable_sort 稳定排序
- unique 重排元素,将相邻的重复元素移到后面,是的前部没有相邻的重复元素。返回不重复区域之后的一个位置。
- for_each 传入谓词,对每个元素执行谓词
- transform 传入谓词,对每个元素执行谓词并用其返回值替代该元素
定制操作
向算法传递函数
lambda表达式
表示一个可调用的代码单元
[capture list] (parameter list) ->return type {function body}
- capture list(捕获列表)lambda所在函数定义的局部变量的列表。
- 可以忽略参数列表和返回类型,但必须包含捕获列表和函数体。
-
- [] 无捕获,函数体内不能访问任何外部变量
- [=] 以值(拷贝)的方式捕获所有外部变量,函数体内可以访问,但是不能修改。
- [&] 以引用的方式捕获所有外部变量,函数体内可以访问并修改(需要当心无效的引用);
- [var] 以值(拷贝)的方式捕获某个外部变量,函数体可以访问但不能修改。
- [&var] 以引用的方式获取某个外部变量
- [=, &var] 引用捕获变量var,其他外部变量使用值捕获。
- [&,var] 只捕获变量var,其他外部变量使用引用捕获。
- 在类中[this] 传递类内对象
参数绑定
头文件functional中
auto newCallable = bind(callable, arg_list);
- arg_list表示调用newCallable时的传递给callable的参数
- arg_list中形如_n的参数为占位符,表示生成的newCallable中的参数
- 占位符定义在std::placeholders下
- 可用其重排参数顺序
- 若要传递引用,要使用标准库函数ref或cref
迭代器
- back_inserter
向容器插入元素的迭代器。向其赋值,该值就被添加到容器中。
vector vec;
auto it = back_inserter(vec);
fill_n(it, 10, 0); //添加10个0
- front_inserter
- inserter
- istream_iterator 流迭代器
istream_iterator int_it(cin); //从cin读取int
istream_iterator int_eof; //默认初始化获得尾后迭代器
对于一个绑定到流的迭代器,一旦其关联的流遇到文件尾或者遇到IO错误,迭代器的值就与尾后迭代器相等。
//流迭代器的奇淫巧计-输入vector
istream_iterator in_iter(cin), eof;
vector v(in_iter, eof); //从范围迭代器构造
//绑定到输出流,不能默认初始化,不存在尾后迭代器
ostream_iterator out_iter(cout, " \n");
out_iter = 123;
out_iter = 566;
存在*,++运算符,但不会做任何时,都返回其本身
泛型算法所需的迭代器
泛型算法形参模式
- alg(beg, end, …)
- alg(beg, end, dest, …)
- alg(beg, end, beg2, …)
- alg(beg, end, beg2, end2, …)
- dest 指示可写入的目的位置
- beg2, end2 指示第二个范围
泛型算法命名规则
- 接收比较函数的重载
- xx_if版本,接收谓词的版本
- xx_copy版本,将结果写到指定位置的版本
- xx_copy_if
特定容器算法 - list和forward_list
- list和forward_list不能提供随机访问迭代器,所有通用的sort不能对其使用。
- list和forward_list定义了独有的sort、merge、remove、reverse和unique。(merge、remove、reverse、unqiue可以用通用版本的,但效率低)
- 其merge会销毁参数的容器
- 特有操作:splice 拼接两个list/forward_list