C++ Primer 第五版 第十章 泛型算法

C++Primer 第五版 —— 《第十章 》泛型算法 目录 目录 Preface 概述( find 算法) find 算法是如何工作的 只读算法(find、count、accumulate 338P) 使用accumulate 算法将 vector中的 string 元素连接起来 用equal 操作两个序列(339P) 使用 fill 和 fill_n 算法向容器写入元素(340P) 介绍 back_inserter 插入迭代器... 阅读详情
一、概述

除了少数例外。标准库算法都对一个范围内的元素进行操作。我们将此元素范围称为“输入范围”。接受输入范围的算法总是使用前两个参数来表示此范围,两个参数分别是指向要处理的第一个元素和尾元素之后位置的迭代器。

二、初识泛型算法
1. 只读算法

只读算法只会读取其输入范围内的蒜素,而不改变元素。例如:find算法、count算法、accumulate算法。

序列中元素的类型必须与第三个参数匹配,或者能够转换为第三个参数的类型。

由于string定义了+运算符,所以我们可以通过调用accumulate来将vector中所有string元素连接起来。

2. 写容器元素的算法

算法不会执行容器操作。所以此类算法要传递有效的输入范围。

算法不检查写操作

介绍back_inserter

一种保证算法有足够元素空间来容纳输出数据的方法是使用插入迭代器。插入迭代器是一种向容器中添加元素的迭代器。通常情况下,当我们通过一个迭代器向容器元素赋值时,值被赋予迭代器指向的元素。而当我们通过一个插入迭代器赋值时,一个与赋值号右侧相等的元素被添加到容器中。

back_insert是定义在头文件iterator中的一个函数。

拷贝算法

拷贝(copy)算法是另一个向目的位置迭代器指向的输出序列中的元素写入数据的算法。此算法接受三个迭代器,前两个表示一个输入范围,第三个表示目的序列的起始位置。此算法将输入范围中的元素拷贝到目的序列中。传递给copy的目的序列至少要包含与输入序列一样多的元素。

copy返回的是其目的位置迭代器(递增后)的值。

3. 重排容器元素的算法

举例:sort算法。调用sort会重排输入序列中的元素,使之有序,它是利用元素类型的<运算符来实现排序的。

其中words的大小并未改变。

标准库算法对迭代器而不是容器进行操作。因此,算法不能(直接)添加或删除元素。

三、 定制操作
谓词

谓词是一个可调用的表达式,其返回结果是一个能用作条件的值。标准库算法所使用的谓词分为两类:一元谓词(意味着它们只接受单一参数)和二元谓词(意味着它们有两个参数)。接受谓词参数的算法对输入序列中的元素调用谓词。因此,元素类型必须能转换为谓词的参数类型。

isShorter是提供给sort的谓词。

stable_sort算法维持相等元素的原有顺序。

2. lambda表达式

一个lambda表达式表示一个可调用的代码单元,我们可将其理解为一个未命名的内联函数。与函数类似,一个lambda具有一个返回类型、一个参数列表和一个函数体。但与函数不同,lambda可能定义在函数内部。一个lambda表达式具有如下形式

其中,capture list(捕获列表)是一个lambda所在函数中定义的局部变量的列表(通常为空);return type、parameter list和function body与任何普通函数一样,分别表示返回类型、参数列表和函数体。lambda使用尾置返回来指定返回类型。

我们可以忽略参数列表和返回类型,但必须永远包含捕获列表和函数体。

在此例中,我们定义了一个可调用对象f,它不接受参数,返回42;

lambda的调用方式与普通函数的调用方式相同,都是使用调用运算符:

如果函数体只是一个return语句,则返回类型从返回的表达式的类型推断而来。否则,返回类型为void。

向lambda传递参数

与普通函数不同,lambda不能有默认参数。

空捕获列表表明此lambda不使用它所在函数中的任何局部变量。

使用捕获列表

一个lambda通过将局部变量包含在其捕获列表中来指出将会使用这些变量。捕获列表指引lambda在其内部包含访问局部变量所需的信息。

举例:

for_each算法

3. lambda捕获和返回

变量的捕获方式可以是引用或值。

值捕获

与参数不同,被捕获的变量的值是在lambda创建时拷贝,而不是调用时拷贝:

引用捕获

隐式捕获

在捕获列表中写一个&或=,指示编译器推断捕获列表。&告诉编译器采用引用捕获方式,=则表示采用值捕获方式。

可变lambda

4. 参数绑定
标准库bind函数

bind函数定义在头文件functional中。可以将bind函数看作一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。

使用placeholders名字

名字_n都定义在一个名为placeholders的命名空间中,而这个命名空间本身定义在std命名空间。

bind的参数

可以用bind绑定给定可调用对象中的参数或重新安排其顺序。

绑定引用参数

如果我们希望传递给bind一个对象而又不拷贝它,就必须使用标准库ref函数:

推荐使用lambda。

四、再探迭代器

除了为每个容器定义的迭代器之外,标准库在头文件iterator中还定义了额外几种迭代器。这些迭代器包括以下几种。

插入迭代器:这些迭代器被绑定到一个容器上,可用来向容器插入元素。

流迭代器:这些迭代器被绑定到输入或输出流上,可用来遍历所关联的IO流。

反向迭代器:这些迭代器向后而不是向前移动。除了forward_list之外的标准库容器都有反向迭代器。

移动迭代器:这些专用的迭代器移动其中的元素。

1. 插入迭代器

插入器是一种迭代器适配器,它接受一个容器,生成一个迭代器,能实现向给定容器添加元素。当我们通过一个插入迭代器进行赋值时,该迭代器调用容器操作来向给定容器的指定位置插入一个元素。

插入器有三种类型,差异在于元素插入的位置:

back_inserter创建一个使用push_back的迭代器。

front_inserter创建一个使用push_front的迭代器。

inserter创建一个使用insert的迭代器。此函数接受第二个参数,这个参数必须是一个指向给定容器的迭代器。元素将被插入到给定迭代器所表示的元素之前。

当调用inserter(c, iter)时,我们得到一个迭代器,接下来使用它时,会将元素插入到iter原来所指向的元素之前的位置(iter仍指向原来所指的元素)。当我们调用front_inserter时,元素总是插入到容器第一个元素之前。

2. iostream迭代器

istream_iterator读取输入流,ostream_iterator向一个输出流写数据。这些迭代器将它们对应的流当作一个特定类型的元素序列来处理。通过使用流迭代器,我们可以用泛型算法从流对象读取数据以及向其写入数据。

istream_iterator操作

当创建一个流迭代器时,必须指定迭代器将要读写的对象类型。一个istream_iterator使用>>来读取流。

对于一个绑定到流的迭代器,一旦其关联的流遇到文件尾或遇到IO错误,迭代器的值就与尾后迭代器相等。

使用算法操作流迭代器

istream_iterator允许使用懒惰求值

当我们将一个istream_iterator绑定到一个流时,标准库并不保证迭代器立即从流读取数据。具体实现可以推迟从流中读取数据,直到我们使用迭代器时才真正读取。标准库中的实现所保证的时,在我们第一次解引用迭代器之前,从流中读取数据的操作已经完成了。

ostream_iterator操作

3. 反向迭代器

反向迭代器就是在容器中从尾元素向首元素反向移动的迭代器。递增一个反向迭代器(++it)会移动到前一个元素;递减一个迭代器(--it)会移动到下一个元素。

我们可以通过调用rbegin、rend、crbegin和crend成员函数来获得反向迭代器。

不能从一个forward_list或一个流迭代器创建反向迭代器。

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

假定有一个名为line的string,保存着一个逗号分隔的单词列表,我们希望打印line中的第一个单词。

如果希望打印最后一个单词,可以改用反向迭代器:

我们希望按正常顺序打印从rcomma开始到line末尾间的字符,需要将rcomma转换回一个普通迭代器,能在line中正向移动。我们通过调用reverse_iterator的base成员函数来完成这一转换,此成员函数会返回其对应的普通迭代器:

普通迭代器与反向迭代器的关系反映了左闭合区间的特性。

五、 泛型算法结构
1. 5类迭代器

算法所要求的迭代器操作可以分为5个迭代器类别。

2. 算法形参模式

大多数算法具有以下4种形式之一:

3. 算法命名规范

六、特定容器算法

C++Primer第五版 第十章习题答案(11~20) 11:知识点:很多算法在默认情况下都会使用元素类型的 #include #include #include #include #include using namespace std; void elimDups(vector &s) { cout<<"排序前:"; for (int i = 0; i<s.size(); ++i) { cout<<s[i]<<" "; } cou 阅读详情

相关推荐

【MUJOCO控制篇-2】控制一个简单的机械臂

本篇博客将逐步分析和解释如何通过Python代码使用MuJoCo库来控制一个机械臂模型。我们将从加载模型开始,逐步深入到PID控制器的实现,最后讨论如何实现轨迹跟踪功能。上期内容为如何建模一个简单的机械臂模型,本篇文章将基于上篇内容进行深入探讨如何实现一个简单的控制。

echo_Fangyb的博客 6749

《C++Primer 第五版》——第十章 泛型算法

《C++Primer 第五版》——第九章 顺序容器10.1 概述如何确定使用哪种容器10.2 初识泛型算法对容器可以保存的元素类型的限制9.2.1 迭代器使用左闭合范围蕴含的编程假定9.2.2 容器类型成员9.2.3 begin 和 end 成员9.2.4 容器定义和初始化将一个容器初始化为另一个容器的拷贝容器的列表初始化与顺序容器大小相关的构造函数标准库 array 具有固定大小9.2.5 赋值和swap使用 assign(仅顺序容器)使用 swap9.2.6 容器大小操作9.2.7 关系运算符容器的关系

KCDCY的博客 1013

VLA、世界模型与端到端在智驾中的本质关系与工程落地

世界模型并非3D重建,而是对环境状态转移函数的可微分建模;VLA不是视觉+语言+动作的简单拼接,核心在于跨模态语义对齐。二者共同支撑具身智能系统实现从感知到行动的闭环推演,其技术价值体现在长尾场景泛化能力提升与决策延迟降低。在自动驾驶领域,真实量产方案均采用VLA架构作为多模态感知基础,嵌入轻量级世界模型以支持反事实轨迹推演,并通过WA硬件封装保障实时性,最终由端到端控制层完成像素到扭矩的语义贯通。这种混合架构已成L2+/L3智驾系统的工程共识。

weixin_34163553的博客 366

C++ primer 第五版个人笔记 第十章 泛型算法

10.1 概述 头文件<algorithm>,查找函数find(iterbegin,iterend,val)有三个参数,前两个表示查找范围的迭代器,如果范围中无匹配元素,则返回第二个参数表示搜索失败;count函数可以计算val出现的次数; 泛型算法本身不会执行容器的操作,只会运行于迭代器之上,执行迭代器的操作;算法可能改变容器中元素的值或者移动元素,但永远不会直接添加或删除元素;...

Mint2yx4的博客 301

【教程】ENVI主成分分析详解

主成分分析(PCA)是一种统计方法,简而言之就是用几种特性去描述事物。每个事物都可以用不同的特性去进行表达,但这些特性一般而言是存在相互的融合和冗余,而用主成分分析方法将这些特性进行转换成不相关的新特性。 在ENVI软件中共提供了三种主成分分析方式分别为:(1)Forward PCA Rotation Existing Statistics(2)Forward PCA Rotation New Statistics and Rotate(3)Inverse PCA Rotati...

YW_remote的博客 1万+

告别C盘空间焦虑!Miniforge环境路径精准配置全攻略

本文深入解析Miniforge虚拟环境默认占用C盘空间的根本原因,即未正确配置`.condarc`文件中的`envs_dirs`路径优先级。通过详细的诊断步骤与配置命令,指导用户将环境路径精准迁移至指定磁盘(如D盘),并分享禁用自动激活、使用`--prefix`参数等高阶技巧,帮助开发者彻底告别C盘空间焦虑,实现虚拟环境的整洁与可控管理。

weixin_28831399的博客 239

《C++primer(第五版)》学习之路-第十章:泛型算法

【 声明:版权所有,转载请标明出处,请勿用于商业用途。  联系信箱:libin493073668@sina.com】 10.1 概述 1.大多数算法都定义在头文件algorithm中。标准库还在文件numeric中定义了一组数值泛型算法。 10.2 初识泛型算法 1. accumulate:定义在头文件numeric中。作用是对范围求和。 euqal:定

月下的寂寞肖邦 2569

PCL点云库入门(第1讲)——PCL库简介和安装(Win10/11+VS2019+PCL 1.12.0)

PCL,全称为,即点云库,是一个专注于2D/3D图像和点云处理的大型开源项目。该项目最初由斯坦福大学的杰出计算机视觉专家Radu博士及其团队开发和维护,经过十余年的发展,目前(2024年12月)已更新至1.14.1版本。PCL点云库集成了众多尖端的点云处理算法,这些算法不仅包括基础的滤波、特征估计、表面重建、配准、模型拟合和分割等,还涵盖了更高级的功能,如点云数据的语义理解、场景解析以及动态环境下的实时处理。这些算法能够对含有噪声的点云数据进行有效过滤,去除异常值;

qq_36812406的博客 1万+

c++ primer 第五版学习笔记-第十章 泛型算法

本文为转载,出处:https://blog.youkuaiyun.com/libin1105/article/details/48706281 https://blog.youkuaiyun.com/xiaoshuaisdl/article/details/79740517 10.1 概述 1.大多数算法都定义在头文件algorithm中。标准库...

一只啃着鸡翅写代码的白猫的成长记录 333

反应动力学仿真软件:Kintecus_(12).高级功能与技巧

Kintecus允许用户自定义复杂的反应方程,包括非线性反应和多相反应。通过自定义反应方程,用户可以更准确地描述实际反应系统。多尺度仿真是指在同一模型中同时考虑不同时间和空间尺度的反应过程。Kintecus提供了工具来处理从微观分子动力学到宏观反应动力学的多尺度仿真。通过本节的学习,您已经掌握了Kintecus的高级功能与技巧,包括复杂反应网络的构建、参数优化与敏感性分析、自定义反应机制、多尺度仿真、并行计算与批处理,以及数据可视化与后处理。

kkchenjj的博客 1048

innovus获取mem pin shape box脚本

innovus mem 的pin shae只能通过attitude editor看属性获取其pin shape的box,但是想用脚本处理一定box时,没有别的办法能直接获取box属性。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 1116

C++ Primer(第五版)|练习题答案与解析(第十章:泛型算法)

C++ Primer(第五版)|练习题答案与解析(第十章:泛型算法) 本博客主要记录C++ Primer(第五版)中的练习题答案与解析。 参考:C++ Primer C++ Primer 练习题10.1 头文件algorithm中定义了一个名为count的函数,它类似find,接受一对迭代器和一个值作为参数。count返回给定值在序列中出现的次数。编写程序,读取int序列存入vector中,打印...

qq_24739717的博客 664

MATLAB从入门到精通-APP调用simulink中的参数,并且修改,将结果返回到APP中

本次案例为以下微分方程: 其中方程的初始值为: Step1:搭建simulink文件,如下图所示: 初始值配置在积分模块中,如下图所示: Step2:制作app 操作视频: ,时长01:11 代码: 本文包括APP如何回调simulik中d的参数,以及把simulink中的仿真结果输出到APP中的绘图界面中。 核心代码如下: ...

wenyusuran的专栏 3042

C++Primer第五版 习题答案 第十章 泛型算法(Generic Algorithms)

10.1 #include &lt;vector&gt; #include &lt;iostream&gt; #include &lt;algorithm&gt; using namespace std; int main() { vector&lt;int&gt; v1 = {1,2,3,1,1}; cout &lt;&lt; count(v1.cbegin(), v1.cend(),...

shamozhizhoutx的博客 4615

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

C++primer(第五版)第十章(泛型算法)

大多数算法定义在头文件algorithm中.另外头文件numeric中定义了一组数值泛型算法.一般情况下算法不直接操作容器,而是通过迭代器来对元素进行处理,因此迭代器令算法不依赖容器,但算法依赖于元素类型的操作.泛型算法本身不会执行容器的操作,它们只会运行于迭代器之上.算法永远不会改变底层容器的大小,算法可能改变容器中保存的元素的值,但是不会直接添加或删除元素。

m0_63235356的博客 201

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C++Primer第五版 习题答案 第十章 泛型算法

10.1 #include<iostream> #include<algorithm> #include<vector> using namespace std; int main() { vector<int>v1{ 1,2,4,5,3,1,5,6,8,7,1,1,1,1 }; cout << count(v1.cbegin(), v1.cend(), 1) << endl; return 0; } 10.2 #inclu

qq_24898229的博客 920

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

C++primer第五版笔记-第十章泛型算法

1、概述

liugallup的专栏 978

《C++primer(第五版)》学习笔记-第十章:泛型算法

10.1 概述 大多数算法都定义在头文件algorithm中。标准库还在文件numeric中定义了一组数值泛型算法。 一般情况下,算法并不直接操作容器,而是遍历由两个迭代器制定的一个元素范围来进行操作。 需要注意的是:迭代器算法不依赖于容器,但算法依赖于容器类型的操作。 大多数算法提供了一种方法,允许我们使用自定义的操作来代替默认的操作符。 泛型算法本身不

Mr_pan 528

c++primer(第五版) 第十章 泛型算法习题答案

第五版第九章以后的参考答案在网上很难找,于是就决定自己认真写一份,当做练习吧. 10.1,    10.2#include #include #include #include #include using namespace std; int main() { vectorv{1,2,3,4,5,6,7,8,9};

旧时光 1323

C++Primer(第五版 )第十章 泛型算法 章节编程练习答案

10.2重做上一题,但读取string序列存入list中。 答:

是鲤鱼啊 387

c++ primer(第五版)笔记 第十章 泛型算法(1)

// 泛型算法(generic algorithm),大部分定义在 algorithm.h 中,numeric.h 定义了一组数值泛型算法 // 1>访问序列中首元素 // 2>元素运算 // 3>满足条件,返回结果 // 4>否则继续查找 // 5>到达序列尾,停止 // 6>返回未找到的值,类型同3一样 // 除步骤2外,都可以使用迭代器操作,所以不依赖容器 // 但步骤2

cook A code 427

c++ primer(第五版)学习笔记及习题答案代码版(第十章)泛型算法

需包含 Sales_item.h需包含 需要//Sales_item.h #ifndef SALESITEM_H // we're here only if SALESITEM_H has not yet been defined #define SALESITEM_H // Definition of Sales_item class and related functions goes

refuil的博客 849

c++ primer(第五版)笔记 第十章 泛型算法(2)

#include #include #include #include using std::cout; using std::cin; using std::endl; using std::vector; using std::string; //_1 占位符的空间 using namespace std::placeholders; inline string make_plural( s

cook A code 501

c++ primer(第五版)笔记 第十章 泛型算法(3)

// 流迭代器(stream iterator) // istream_iterator 读取输入流 // ostream_iterator 写入输出流 // 反向迭代器(reverse iterator) // 移动迭代器(move iterator) #include #include #include #include using std::deque; using std::cin

cook A code 538

c++ primer(第五版)笔记 第十章 泛型算法(4)

// istream_iterator 操作 // istream_iterator in(is) in 从输入流 is 中读取类型为 T 的值 // istream_iterator end 表示尾后位置 // in1 == in2 in1 和 in2 必须读取相同类型,如果他们都是尾后迭代器,或绑定到相同的输入,则相等 // in1 != in2 // *in 返回流中读取的值 //

cook A code 696

C++Primer第五版 第10章 泛型算法(练习解答)

进入这一章的学习,真正领略到库的强大,在头文件algorithm中,定义了丰富的算法,何为泛型,以前对泛型这个词不太了解,一直以为泛型编程很恐怖,实际接触了这一章,才开始有点点明白泛型的意味,当然在这边不展开解释,只可意会,不可言传。关于写到这里要说明的是,其实前面的九章基本九月份之前就写好了,这几天想到,应该把学习的积累放到一个地方供自己翻阅,想到了优快云的博客,写到这里,进度基本赶上来了,下面

Nick Feng 的小屋 1296
上一篇: C++ Primer 第五版 第九章 顺序容器
下一篇: C++ Primer 第五版 第十一章 关联容器
青禾子的夏
博客等级 码龄8年 405粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值