C++ Primer 第10章泛型算法

news2024/11/16 11:49:29

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.coloradmin.cn/o/672896.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:在SEO优化中如何利用Python检测IP地址连通?

在SEO优化中如何利用Python检测IP地址连通&#xff1f; 在SEO优化中&#xff0c;IP地址连通是非常重要的一个因素&#xff0c;对于网站的排名也有直接的影响。Python作为现代编程语言&#xff0c;具有良好的可读性&#xff0c;易于学习&#xff0c;功能丰富且拥有大量的库&…

vue3实战技巧 - Vite和项目结构

vue3脚手架 Vite Vite-Next Generation Frontend Tooling Vite是一个前端的脚手架&#xff0c;支持React/Vue......vite是vue作者尤雨溪开发 npm init vitelatest / yarn create vitelatest name vue vue-ts cd name npm install / yarn install npm run dev Vite特性…

XuperChain成长计划专属社区上线!

专属XuperChain成长计划用户的去平台化社交平台来了&#xff01; 为加强与XuperChain成长计划用户的沟通&#xff0c;做到“事事有回音”&#xff0c;我们依托XuperSocial建设了星际社区之外的第二个官方运营社区——XuperChain成长社区。持有已发行的XuperChain创世、监督、共…

一文了解Python编程语言及安装

目录 &#x1f352;初识Python &#x1f352;什么是编程语言 &#x1f352;安装python&#xff08;windows&#xff09; &#x1f352;安装python&#xff08;Linux&#xff09; &#x1f990;博客主页&#xff1a;大虾好吃吗的博客 &#x1f990;专栏地址&#xff1a;Python从…

MySQL是什么,如何整合SpringBoot,以及使用优势

目录 一、MySQL是什么 二、如何整合SpringBoot 三、MySQL使用优势 一、MySQL是什么 MySQL是一种开源的关系型数据库管理系统&#xff0c;采用客户机/服务器模式实现数据存储和管理。其最初由瑞典的MySQL AB公司开发&#xff0c;后来被Sun Microsystems收购&#xff0c;最终…

Python中的pyc文件是作什么用的?(61)

小朋友们好&#xff0c;大朋友们好&#xff01; 我是猫妹&#xff0c;一名爱上Python编程的小学生。 和猫妹学Python&#xff0c;一起趣味学编程。 py文件和pyc文件 我们都知道py后缀是Python源码文件&#xff0c;偶尔还会看到pyc后缀文件。 pyc后缀文件是做什么用的呢&…

chatgpt赋能python:Python桌面软件实例:探索Python桌面应用的无穷魅力

Python桌面软件实例&#xff1a;探索Python桌面应用的无穷魅力 Python语言不仅在Web开发上应用广泛&#xff0c;在桌面应用程序上也建立了它的声誉。Python在桌面端编程领域的扩展性和可扩展性极高&#xff0c;使得任何人都可以开发各种类型的桌面应用程序。 在本文中&#x…

NUCLEO-F411RE RT-Thread 体验 (7) - GCC环境外部中断的使用

NUCLEO-F411RE RT-Thread 体验 (7) - GCC环境外部中断的使用 1、简述 NUCLEO-F411RE开发版的蓝色按键对应PC13管脚&#xff0c;我们将其配成外部中断的方式&#xff0c;并设置低电平触发。 2、测试代码 驱动其实对应的还是之前移植好的pin驱动&#xff0c;所以这里不需要修…

chatgpt赋能python:Python查询网页数据的SEO技巧

Python查询网页数据的SEO技巧 Python是一种强大的编程语言&#xff0c;可以用来处理各种类型的数据。其中一种应用是查询网页数据&#xff0c;这在SEO优化中非常重要。本文将介绍Python在查询网页数据时的技巧。 什么是SEO? SEO&#xff08;Search Engine Optimization&…

【UCOS-III】自我学习笔记→第26讲→计数型信号量

文章目录 前言实验步骤1.复制二值信号量工程&#xff0c;添加task2&#xff0c;修改二值信号量的名字为计数型变量2.修改开始任务&#xff0c;任务1以及任务2的内容3.查看串口现象 测试代码工程文件总结 前言 无&#xff0c;仅作记录&#xff0c;不具有参考价值&#xff0c;所…

编译原理笔记15:自下而上语法分析(2)LR 分析基础、LR 分析表、LR(0) 分析表

目录 LR分析LR 分析的特点&#xff1a;LR 分析表格局与动作改变格局的动作的含义&#xff1a;转移表含义&#xff1a; LR(k) 文法 LR(0) 项目和 LR(0) 项目集规范族LR(0) 分析表构造步骤&#xff1a;活前缀构造 LR(0) 分析器的关键&#xff1a;为 G 构造一个识别它的所有活前缀…

STM32G0+EMW3080+阿里云飞燕平台实现单片机WiFi智能联网功能(三)EMW3080完成配网,EMW3080连接到阿里云飞平台

项目描述&#xff1a;该系列记录了STM32G0EMW3080实现单片机智能联网功能项目的从零开始一步步的实现过程&#xff1b;硬件环境&#xff1a;单片机为STM32G030C8T6&#xff1b;物联网模块为EMW3080V2-P&#xff1b;网联网模块的开发板为MXKit开发套件&#xff0c;具体型号为XCH…

尝试解决一次跨域问题

上文出现跨域问题&#xff1b; 下面根据网上资料看一下设置360浏览器允许&#xff1b; 我的360浏览器安装目录如下&#xff1b; 根据资料&#xff1b;在360浏览器的启动命令后加上参数&#xff0c;加上之后如下&#xff0c; C:\Users\Administrator\AppData\Local\360ChromeX\C…

编译原理笔记14:自下而上语法分析(1)短语、句柄,规约,移进规约分析器的工作模式

目录 基本方法短语、句柄&#xff0c;规范规约&#xff0c;剪句柄短语、直接短语和句柄规范规约&#xff08;最左规约&#xff09;例&#xff1a; 移进-规约移进规约分析器的工作模式移进规约分析例&#xff1a; 基本方法 从句子 ω 开始&#xff0c;从左到右扫描 ω&#xff0…

实现自动驾驶的难点有哪些?

摘要&#xff1a; 这里主要介绍了传感器融合&#xff08;SF&#xff09;对目标方面的几类任务&#xff0c;除目标之外&#xff0c;传感器融合还能做很多其他对环境建模的任务&#xff0c;例如道路特征的描述、占用栅格地图以及可通行区域表示等等。 从车道保持到高阶自动驾驶功…

【从零开始学习JAVA | 第二篇】JAVA综合练习 (1)

目录 前言&#xff1a; 1.买飞机票 2.找质数&#xff1a; 3.开发验证码&#xff1a; 4.数组元素的复制&#xff1a; 5.评委打分&#xff1a; 6.数字加密&#xff1a; 前言&#xff1a; 本篇将起到总结的作用&#xff0c;利用具体案例来带我们复习JAVA的基础内容&#xff…

CountDownLatch源码

介绍 CountDownLatch是依赖AQS完成的线程阻塞和唤醒&#xff0c;利用AQS的共享锁完成锁的多线程获取和释放。 CountDownLatch 使用了共享锁模式。CountDownLatch 使用一个内部类 Sync来实现CountDownLatch的同步控制&#xff0c;而Sync是AQS的一个实现类&#xff0c;它使用AQ…

安装Node,环境配置详细教程及使用

安装Node&#xff0c;环境配置详细教程及使用 一.下载 https://nodejs.org/en/download 一般现在windows电脑都选64位&#xff0c;如果是其他系统或者需要更低的版本可以按照自己的需求进行下载安装&#xff0c;过程都大差不多 二.安装 node.js的安装过程一般都不需要勾选什…

2023/6/21总结

JS 解绑事件 对象.on事件 对象.on事件null 如果是 addEventListener方式必须使用 对象.removeEventListener () 匿名函数无法解绑 mouseover和mouseout会有冒泡效果mouseenter和mouseleave没有冒泡效果 事件委托&#xff1a; 事件委托是利用事件流的特征解决一…

第九章 ShuffleNetv1网络详解

系列文章目录 第一章 AlexNet网络详解 第二章 VGG网络详解 第三章 GoogLeNet网络详解 第四章 ResNet网络详解 第五章 ResNeXt网络详解 第六章 MobileNetv1网络详解 第七章 MobileNetv2网络详解 第八章 MobileNetv3网络详解 第九章 ShuffleNetv1网络详解 第十章…