ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

泛型算法笔记

2021-11-11 15:58:40  阅读:79  来源: 互联网

标签:容器 函数 迭代 可以 元素 笔记 算法 泛型


  1. 泛型算法就是为了弥补 顺序容器中的成员函数不多的缺点。定义了一组算法,可以实现多个不同的功能,同时可以适用于多个容器。这些算法都定义在头文件 algorithm 中,numeric 文件中也定义了一组数值泛型算法。
  2. 泛型算法独立于容器。有的是依赖元素类型的操作的。比如,需要find函数需要有 == 运算符。其他算法可能要求元素类型支持 < 运算符。不过多数也支持通过函数的方式来传入比较规则。
  3. 泛型算法分类:
    • 只读算法:常见的有
      • find,用来返回第一个等于给定元素的迭代器。否则给定最后的迭代器。
      • find_if ,除了迭代器外,还需要给出一个 谓词,可以使用lambda来提供。返回第一个调用谓词返回true的迭代器。
      • for_each函数也传入一个谓词,来对所有迭代器内的元素来执行谓词。
      • accumulate,定义在numeric中。用来求和。第三个参数为和的初始值。可以利用这个算法来将一个vector中的所有string连接起来。
      • equal函数,用来比较两个容器中的元素是不是各个相等。接受三个参数,假定第二个序列的长度 >= 第一个序列的长度。
    • 写入算法
      • 由于传入的都是迭代器,迭代器没办法去执行容器操作。因此没办法扩大容器的容量。我们写入的数据不应该超出容器的当前容量。
      • fill 函数可以在两个迭代器之间的元素设置为某一个值
      • fill_n 函数可以在迭代器指定的位置以及之后的n个元素设置为指定值。容易超出界限,未定义!如果这个迭代器是back_inserter(vec) 的结果,那么back_inserter迭代器可以作为迭代器使用,但是将其赋值总是可以将值插入到末尾。
      • copy函数可以完成元素的拷贝。
      • replace可以实现将一个序列中的某一个元素进行替代。replace_copy 可以将替代后的结果装到另外一个容器中去。
    • 重排元素算法
      • sort函数可以排列成员,其使用 < 运算符。
      • stable_sort 为稳定的排序。如果比较的结果相同,则位置不变。
      • unique可以将那些不重复的元素放在前面,返回不重复序列的后一个元素的迭代器。使用之前,应该先排好序。
    1. 定制操作:
      • 比如sort,可以传入一个 谓词作为参数,可以调用谓词来进行比较判断。
      • 定制操作依赖的其实就是 可调用对象。可调用对象包括有 函数,函数指针,重载了函数调用运算符的类,以及lambda表示式(可以理解为匿名内联函数)
      • lambda表达式的捕获列表中可以是局部变量的拷贝(在声明的时候就拷贝进去,后面值再改变也不改变了。如果局部变量不允许拷贝,那么就失败,必须用引用),也可以是局部变量的引用(随着后续的变化而变,有时是必须的。比如ostream对象)。
      • lambda可以使用隐式捕获,也就是让编译器再函数体中找不到变量的时候,自动取寻找。再捕获列表中写 & 表示默认引用捕获, 写 = 表示默认值捕获。也可以写上 隐式捕获规则符号之后再写上需要用不同的规则捕获的变量列表。例如,使用 = 表示默认值捕获,如果还想使用引用捕获的话,那么再加上变量列表,再前面需要加上&
      • lambda可以具有捕获局部变量的功能,这是一般的函数做不到的。如果函数真的想实现这样的功能的话,可以利用bind函数,在functional头文件里。bind函数可以实现将一个函数名作为参数,和可以调用这个函数的参数作为参数。返回另外一个可调用对像,可以将这个新可调用对象的参数用于参数到bind参数中的占位符中去。可以实现减少调用参数的目的。
      • bind函数还可以进行函数参数的顺序调整。可以起到神奇的效果。
  4. 迭代器再探究
    • 插入迭代器:
      • 其插入操作是调用的 容器的插入操作。其可以认为是容器的一个假身。看着像是迭代器。it = t操作会将值 t 进行插入(插入到哪里要看it是什么位置的插入迭代器)。 而 it++, it–, *it 操作都有定义,但是没有任何意义,仍然返回it
      • 包括三种, back_inserter(it = t 会调用push_back), front_inserter(push_front), inserter(insert(it, p)).
    • iostream 迭代器
      • 包括istream_iterator 和 ostream_iterator两种
      • 可以利用这种迭代器来完成读取流输入或者完成流输出的作用
      • 可以认为输入和输出的缓冲区可以看作某种类型的容器,因此可以使用迭代器
    • 反向迭代器
      • 其++ 和 – 的效果是相反的,其begin和end也是相反的。begin指向最后一个元素。end指向第一个元素之前的元素。
      • 将这个迭代器用于泛型算法,可以实现某种效果。比如find参数使用反向迭代器,可以起到反向查找的作用。
      • reverse_iterator 的base成员函数可以返回一个普通的迭代器。
  5. 泛型算法结构
    • 迭代器可以分为5类。分别为输入迭代器(只读,不写), 输出迭代器(只写,不读),前向迭代器(可读写,多遍扫描,只能递增), 双向迭代器(可读写,多遍扫描,可递增递减), 随机访问迭代器(支持全部迭代器操作)
    • 参数规范之类的不是很重要的东西

标签:容器,函数,迭代,可以,元素,笔记,算法,泛型
来源: https://blog.csdn.net/weixin_44261255/article/details/121228951

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有