C++ primer | 第10章 泛型算法

来源:互联网 发布:印度军工产业知乎 编辑:程序博客网 时间:2024/06/16 01:15

10.1 概述

泛型算法 generic algorithm 提供了一些经典的算法接口比如排序、搜索等,适用于多种的容器和元素。
算法一般使用迭代器来工作

//在vector容器vec中findauto result = find(vec.cbegin(),vec.cend(),val);//在数组中findint* result=find(begin(ia),end(ia),val);

迭代器令算法不依赖于容器,但是算法依赖于元素的类型。

10.2 初识泛型算法

  1. 只读算法
    • find
    • accumulate
    • equal
  2. 写容器元素的算法
    • fill
    • fill_n(dest,n,val)/fill_n(vec.begin(),vec.size(),0);
    • back_inserter,返回一个与该容器绑定的插入迭代器
    • copy
    • repalce
    • replace_copy(ilst.cbegin(),ilst.cend(),back_inserter(ivec),0,42)//ilst并未改变,ivec包含ilst的一份拷贝,并且0变为了42.
  3. 重排
    • sort
    • unique()//没有删除重复元素

10.3 定制操作

  1. 向算法传递表达式
    这里使用谓词(predicate)来传递函数,比如使用一个比较单词长度的表达式来代替sort中原来的<运算。
    另外本小节提到了stable_sort函数
  2. lambda
    lambda的使用形式为[capturelist](parameter list)->return type{function body}如果可以不用加return type可以写成[capturelist](parameter list){function body}
    本节中介绍的函数有 find_if for_each
    完整的函数
    这里写图片描述
  3. lambda的捕获和返回
    • 值捕获
    • 引用捕获
    • 隐式捕获 & 或=
    • 混合使用隐式和显示
    • mutable 可变lambda
    • 引用捕获可变lambda
    • 指定返回类型
  4. 参数绑定
    • bind 可以看作函数的一个适配器,定义在functional头文件中,形式如auto newcallalbe=bind(callable,arg_list) arg_list是一些形如_1,_2,...,_n的占位符
    • 占位符来自namespace:placeholders 可以这样声明using namespace std::placeholders
    • bind的参数调用时按照1-》n的顺序,因此可以用来重排参数
    • 绑定引用参数使用ref或cref函数,此函数与bind定义在同一个头文件中

10.4 再探迭代器

  • 插入迭代器 insert iterator
  • 流迭代器 steam iterator
  • 反向迭代器 reverse iterator
  • 移动迭代器 move iterator

    1. 插入迭代器
      • back_inserter
      • front_inserter
      • inserter
    2. iostream
      • istream_iterator//istream_iterator<T>in(is);istream_iterator<T> end;
      • ostream_iterator//ostream_iterator<T>out(os);ostream_iterator<T> out(os,d);d指向一个空字符结尾的字符数组
    3. 反响迭代器
      • 有个成员函数base()用来完成正向转换

10.5 泛型算法结构

基本特性:要求迭代器哪些操作
五类迭代器:
1. 输入
2. 输出
3. 前向
4. 双向
5. 随机访问、、支持下标运算符
算法的形参模式:

alg(beg,end,other);alg(beg,end,dest,other);//只接受单个目标直接指向一个容器的迭代器alg(beg,end,beg2,other);//接受第二个输入序列alg(beg,end,beg2,end2,other);

命名规范:
1. 重载接受谓词
2. _if 版本
3. _copy版本

10.6 特定容器算法

list和forward_list应该优先使用成员函数而不是通用算法,但是要注意链表版本的算法会改变底层的容器。
链表类型的几个成员函数:

mergeremoveremove_ifreversesortuniquesplice

总结

    • 1 概述
    • 2 初识泛型算法
    • 3 定制操作
    • 4 再探迭代器
    • 5 泛型算法结构
    • 6 特定容器算法
  • 总结

0 0
原创粉丝点击