C++:泛型算法

泛型算法 Generic Algorithm

  • 接收输入范围的算法总是使用前两个参数表示此范围

常用

  • find
  • find_if 传递谓词,找到第一个符合条件的
  • count 查找元素出现的次数
  • count_if
  • accumulate 求和,numeric头中,传入范围,和的初始值
  • equal 比较两个序列是否相同
  • fill 填充
  • copy
  • replace 替换元素
  • replace_copy 替换元素,不改变原序列,结果输出到另一个序列
  • (很多算法都有copy版本)
  • sort 排序
  • stable_sort 稳定排序
  • unique 重排元素,将相邻的重复元素移到后面,是的前部没有相邻的重复元素。返回不重复区域之后的一个位置。
  • for_each 传入谓词,对每个元素执行谓词
  • transform 传入谓词,对每个元素执行谓词并用其返回值替代该元素

定制操作

向算法传递函数

  • 谓词(predicate) 可调用表达式

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
//绑定到输出流,不能默认初始化,不存在尾后迭代器
ostream_iterator out_iter(cout, "  \n");
out_iter = 123;
out_iter = 566;

存在*,++运算符,但不会做任何时,都返回其本身

  • rbegin() rend() 获得反向迭代器
    • 其成员base() 返回相应对应的普通迭代器

泛型算法所需的迭代器

C++:泛型算法_第1张图片

泛型算法形参模式

  • 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

你可能感兴趣的:(C++,c++,容器)