C++ Primer 第10章泛型算法

news/2024/12/2 12:41:18/

10.1 概述

  • 大多数算法定义在algorithm中,标准库还在头文件numeric中定义了数值泛型算法
  • 一般情况下,这些算法并不直接操作容器,而是遍历由两个迭代器指定的一个元素范围来进行操作。
  • find(迭代器1.cbegin(),迭代器2.cend(),元素);当不能找到时,返回迭代器2.
  • 由于指针就像内置数组上的迭代器一样,使用标准库中的begin和end来获得数组中首元素和尾元素的指针也可以在数组中查找:
    find(begin(arr),end(arr),元素);# 10.2 初始泛型算法

算法如何工作

迭代器令算法不依赖与容器,。。。。

。。。。,但算法依赖于元素类型的操作

在这里插入图片描述

10.2 初始泛型算法

  • 除了少数例外,标准库算法都对一个范围内的元素进行操作。称此范围为输入范围
  • 理解算法最基本的方法就是了解他们是否读取元素,改变元素,重排元素

10.2.1 只读算法

  • 例如find函数和count函数
  • accumulate函数(begin,end,和的初值).
    accumulate的第三个参数的类型决定了函数中使用那个加法运算符已经返回值的类型

算法和元素类型

在这里插入图片描述

操作两个序列的算法

  • equal:接受三个迭代器,前两个表示第一个序列中的元素范围,第三个表示第二个序列的首元素
  • 由于利用迭代器完成操作,因此我们可以通过调用equal来比较不同类型的容器中的元素。元素类型可以不必一样,只要我们能用==来比较两个元素类型即可。例如string和const char*

那些只接受一个单一迭代器来表示第二个序列的算法,都假定第二个序列至少与第一个序列一样长

  • equal(roster1.cbegin(),roster1.cend(),roster2.cbegin());
    如果roster都是C分格的字符串即const char *则用==比较两个char对象,只是检查两个指针值是否相等,即地址是否相等而不是其中字符是否相同

10.2.2 写容器元素的算法

  • 算法不会执行容器操作,因此他们自身不可能改变容器的大小
    在这里插入图片描述

算法不检查写操作

  • fill_n:写入指定元素

介绍back_inster

在这里插入图片描述

拷贝算法

在这里插入图片描述

课后题

在这里插入图片描述

	list<int> ilst = {1,2,3,4};fill_n(ilst.begin(), ilst.size(), 0);
  • a程序中进行缺省初始化,但是vec为空,copy无法进行,如需改变容器大小,需要使用一类特殊的称为插入器的迭代器。将第三个参数改为back_insterter(vec);
    在这里插入图片描述
    在这里插入图片描述

10.2.3 重排容器元素的算法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

10.3 定制操作

10.3.1 向算法传递函数

谓词

  • 是一个可调用的表达式,其返回结果是一个能用作条件的值

在这里插入图片描述
在这里插入图片描述

10.3.2 lambda表达式

在这里插入图片描述

  • 尾置返回 auto GetType() -> int;
    在这里插入图片描述

向lambda传递参数

  • lambada不能有默认参数
    在这里插入图片描述

使用捕获列表

  • 一个labbda通过即将局部变量包含在其捕获列表中来指出将会使用这些变量。
  • 一个lambda只有在其捕获列表中捕获一个它所在函数中的局部变量,才能在函数中使用该变量
    在这里插入图片描述

for_each算法

在这里插入图片描述
在这里插入图片描述

10.3.3 lambda捕获和返回

  • 当定义一个lambda时,编译器生成一个与lambda对应的新的(未命名的)类类型。可以这样理解,当向一个函数传递一个lambda时,同时定义了一个新类型和该类型的一个对象。
    在这里插入图片描述

值捕获

  • 采用值捕获的前提是变量可以拷贝。与参数不同,被捕获的变量的值是在lambda创建时拷贝,而不是调用时拷贝。
    在这里插入图片描述

引用捕获

  • 采用引用捕获必须确保被引用的对象在lambda执行的时候是存在的。lambda捕获的都是局部变量,这些变量在函数结束之后就不存在了。
  • 我们也可以从一个函数返回一个lambda。但此lambda不能包含引用捕获

在这里插入图片描述

隐式捕获

  • 为了指示编译器推断捕获列表,应在捕获列表中写一个&或=。前者告诉编译器采用捕获引用方式,后者表示采用值捕获方式。
    在这里插入图片描述

可变lambda

在这里插入图片描述

指定lambda返回类型

在这里插入图片描述

10.3.4 参数绑定

在这里插入图片描述

绑定check_size的sz参数

在这里插入图片描述

使用placeholders名字

在这里插入图片描述

bind参数

在这里插入图片描述

用bind重排参数顺序

在这里插入图片描述

绑定引用参数

在这里插入图片描述

10.4 再探迭代器

在这里插入图片描述

10.4.1 插入迭代器

在这里插入图片描述
在这里插入图片描述

10.4.2 iostream迭代器

在这里插入图片描述

istream_iterator操作

在这里插入图片描述
在这里插入图片描述

使用算法操作流迭代器

在这里插入图片描述

istream_iterator允许使用懒惰求值

在这里插入图片描述

ostream_iterator操作

在这里插入图片描述

使用流迭代器处理类类型

在这里插入图片描述

10.4.3 使用反向迭代器

在这里插入图片描述

反向迭代器需要递减运算符

在这里插入图片描述

反向迭代器与其他迭代器之间的关系

在这里插入图片描述
在这里插入图片描述

10.5 泛型算法结构

在这里插入图片描述

10.5.1 5类迭代器

在这里插入图片描述

迭代器类别

输入迭代器

在这里插入图片描述

输出迭代器

在这里插入图片描述

前向迭代器

在这里插入图片描述

双向迭代器

在这里插入图片描述

随机访问迭代器

在这里插入图片描述

10.5.2 算法形参模式

在这里插入图片描述

接受单个目标迭代器的算法

在这里插入图片描述

接受第二个输入序列的算法

在这里插入图片描述

10.5.3 算法命名规范

一些算法使用重载形式传递一个谓词

在这里插入图片描述

_if版本的算法

在这里插入图片描述

区分拷贝元素的版本和不拷贝的版本

在这里插入图片描述

10.6 特定容器算法

在这里插入图片描述

splice成员

在这里插入图片描述

链表特有的操作会改变容器

在这里插入图片描述


http://www.ppmy.cn/news/510623.html

相关文章

oppo手机投屏到电脑上

1、笔记本开启移动热点&#xff08;手机连接此热点&#xff0c;保证在同一网络下&#xff09; 若笔记本开启移动热点失败&#xff08;win10&#xff09;,提示 “我们无法设置移动热点” 解决方法&#xff1a;右键单击计算机-管理-设备管理器&#xff0c;然后点击菜单栏的查看…

从c进入c++学习笔记

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目…

vue源码理解之Vue批量异步更新和虚拟DOM和Diff算法

一&#xff1a;异步更新队列 1、Vue高效的秘诀是一套批量、异步的更新策略 概念&#xff1a; 事件循环 事件循环&#xff1a;浏览器为了协调事件处理、脚本执行、网络请求和渲染等任务而制定的一套工作机制。 宏任务 代表一个个离散的、独立工作单元。浏览器完成一个宏任务&…

电影《美国队长3》观后感

美国队长3上映了&#xff0c;我看了两遍。 电影大意&#xff1a;之前的任务执行中&#xff0c;复仇者联盟多次误伤了无辜平民&#xff0c;联邦政府要求他们签订一份协议以防止超人武力的滥用&#xff0c;超人们对此产生了分歧。与此同时一个阴谋的开始&#xff0c;彻底点燃了复…

Python绘制美国队长之盾

美国队长之盾的外表涂装与美国国旗相似&#xff0c;由红色&#xff08;象征勇气&#xff09;、白色&#xff08;象征真理&#xff09;和蓝色&#xff08;象征正义&#xff09;组成&#xff0c;中间有着一个白色五角星。 话不多说&#xff0c;直接上代码&#xff01; # -*- cod…

美国队长盾牌复原

美国队长盾牌复原 描述&#xff1a;鼠标焦点在div上&#xff0c;盾牌复原 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>盾牌</title><style>*{margin:0;padding: 0;}body{background…

turtle之绘制美国队长的盾牌

turtle之绘制美国队长的盾牌 文章目录 turtle之绘制美国队长的盾牌第一步&#xff1a;导入库turtle第二步&#xff0c;绘制盾牌的圆&#xff1a;第三步&#xff1a;绘制盾牌中间的五角星&#xff1a;最后一步&#xff1a;调用定义五角星的函数&#xff1a; 第一步&#xff1a;导…

Python绘制美国队长盾牌

用Python绘制一个美国队长盾牌 import turtle as t#灰色背景 t.bgcolor(grey)#绘制红色圆底 t.penup() t.goto(0,-200) t.pendown() t.color(red) t.begin_fill() t.circle(200) t.end_fill()#绘制白色圆 t.penup() t.goto(0,-150) t.pendown() t.color(white) t.begin_fill() …