c++primer plus和c++primer区别_C++ Primer第十章言

2023-05-16


来源:牛客网作者:苍井玛利亚

C++ Primer

泛型算法

f8778aa1cc92979c19685ed390b7d5fb.png

我们前一章学习了容器,不知道你有没有发现,其实容器是一个模板类,就是说在类的上面还有一层,看下面这句话:

vector a;

这里面包含了模板类vector->类vector->对象a,也就是说vector不独立于任何数据类型,它是在数据类型之上的那一层,模板类。

这个特征跟我们这一章要学的泛型算法有些类似,我们有很多的标准库容器,那我们是不是要给每个标准库容器写算法呢?C++不是这样做的,这样太麻烦了,C++的做法是提供一组算法,独立于任何特定的容器,这些算法是类型无关的,是泛型(generic)的:就是说它们可以用于不同类型的容器和不同类型的元素。

在前面学的顺序容器中,我们提供的操作都很基本,增删元素,访问头尾元素等,这一章我们会提供更多有用的操作(而且它们基本可以用于所有的容器)

概述

大多数算法都定义在algorithm中。

算法一般不直接操作容器,而是遍历由两个迭代器指定的一个元素范围(这个就是有点泛型的意思了)。我们来举个例子,假定有一个int的vector,我们要判断里面是否包含一个特定值,代码如下:

int val = 24;
auto res = find(vec.begin(), vec.end(), val);
cout << (res == vec.end() ? "不存在" : "存在") << endl;

是不是超级简单?而且这个find函数可以适用于各种容器,是泛型的。

为什么会这么6这么神奇呢,我们来仔细看看find算法是怎么做的:find算法通过迭代器去依次访问元素,找到就停止,直到尾后元素。

这些都不依赖于容器所保存的元素类型或者是容器类型,它就是迭代器去访问。

迭代器令算法不依赖于容器,这个我们知道了,还有一句话是这样的,但算法依赖于元素类型的操作,这句话怎么理解呢?因为算法在执行时肯定要操作元素,比如我们的find算法,它至少要使用==符号来判等,所以就要求元素类型支持 ==,这里的类型是int,当然支持了。

算法本身不会执行容器的操作,它们只会运行于迭代器之上

初识泛型算法

我们学习的泛型算法基本都对一个范围内的元素进行操作,这个范围由两个参数表示,前一个指向要处理的第一个元素,后一个指向尾元素之后的位置。

只读算法

只读取其输入范围内的元素,从不改变元素。例如之前的find函数,再来一个例子:

int sum = accumulate(vec.cbegin(), vec.cend(), 0);

这个函数是对容器内元素求和,第三个参数是求和的初值,这个算法要求容器内的元素类型支持+,再来一个例子,string定义了+,所以可以对string求和:

int sum = accumulate(vec.cbegin(), vec.cend(), string("")); //泛型,跟上面几乎一样
操作两个序列的算法
equal(vec1.cbegin(), vec1.cend(), vec2.cbegin());

vec2元素数量要大于等于vec1,前面每个元素都对应相等蔡返回true

写容器元素的算法

举个例子:

fill(vec.begin(), vec.end(), 0); //将所有元素重置为0
//但是算法不会去检查写这个操作,例如
vector v;
fill_n(v.beg(), 10, 0); //这个函数企图把v开头的10个元素置为0
//但是会出错,而且不会报编译错误
//再介绍一个函数back_inserter,定义在iterator头文件
vector vv;
auto it = back_inserter(vec); //返回一个插入迭代器,通过向插入迭代器赋值
*it = 24; //就可以成功插入了,vv中有一个元素24
//这里我们调用了它,作用是用插入迭代器来插值
fill_n(back_insertet(v), 10, 0);

拷贝算法

甩代码:

int a1[] = {0, 1, 2, 3, 4};
int a2[sizeof(a1)/sizeof(*a1)]; //相同元素个数
auto ret = copy(begin(a1), end(a1), a2); //把a1的内容拷贝给a2,返回a2尾元素之后的值

还有一个replace算法:

replace(list.begin(), list.end(), 0, 42); //把list中所有的0改为42
//还有一种重载,保留了原来的list
replace(list.cbegin(), list.cend(), back_inserter(ivec), 0, 42);
//list不变,ivec包含list的一份拷贝,不过里面的0都变成42了

重排容器元素的算法

我们要通过一个任务来学习这部分,假定我们要化简一个vector,使得里面保存的单词只出现一次:

//假设原来的vector为a, b, d, c, a, b
void Unique(vector &words)
{
   sort(word.begin(), words.end()); //a, a, b, b, c, d
   auto end_unique = unique(words.begin(), words.end()); //a, b, c, d, a, b
   //end_unique的位置就是第一个重复的元素位置
   words.eraser(end_unique, wors.end()); //a, b, c, d
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++primer plus和c++primer区别_C++ Primer第十章言 的相关文章

  • postman linux 安装包,Postman 下载和安装 · Postman API 自动化测试与持续集成全栈

    8种机械键盘轴体对比 本人程序员 xff0c 要买一个写代码的键盘 xff0c 请问红轴和茶轴怎么选 xff1f Postman 下载与安装 下载 Postman 有 Windows Linux MacOS 等多个版本 xff0c 另外也可
  • (超)超体素

    参考 xff1a PCL 超体聚类点云分割算法详解 x1f4a5 Voxel体素预了解 xff1a 图中是3D数据的不同表示类型 xff08 a xff09 点云 xff08 Point clouds xff09 xff1b b 体素网格
  • linux curl 绑定host,curl请求指定host ip(指定域名解析的内网某ip)

    RequireJS 模块的定义与加载 模块不同于传统的脚本文件 它良好地定义了一个作用域来避免全局名称空间污染 它可以显式地列出其依赖关系 并以函数 定义此模块的那个函数 参数的形式将这些依赖进行注入 而无需引用全局变量 RequireJ
  • http协议_网络协议HTTP详解

    一 http协议的定义 HTTP是超文本传输协议的缩写 是互联网上使用最为广泛的一种网络协议 xff0c 适用于www服务器传输超文本到本地浏览器传输协议 它可以使浏览器的传输更加高效 xff0c 使网络传输减少 他还能使计算机能快速准确的
  • cmake导入so库_CMake与动态链接库(dll, so, dylib)

    使用CMake可以很方便的实现跨平台编译 如果要Link一个第三方库 xff0c 需要针对平台进行设置 这里分享下如何创建一个简单的CMake工程实现Windows Linux和macOS上的自动编译 SDK下载 CMake下载安装 Win
  • ros 开源物体检测_机器人操作系统ROS—使用激光雷达RpLidar A1进行SLAM定位建图

    移动机器人在环境中获取障碍物的具体位置 房间的内部轮廓等信息都是非常必要的 xff0c 这些信息是机器人创建地图 进行导航的基础数据 考虑成本 xff0c 入手了一个SLAMTEC公司的低成本二维激光雷达RpLidar A1进行初步的学习
  • python实现登录抓取_[Python]网络爬虫(五):利用POST方式登录账号抓取

    今天的工作很有意思 我们用 Python 来登录网站 用Cookies记录登录信息 然后就可以抓取登录之后才能看到的信息 今天我们拿知乎网来做示范 为什么是知乎 这个很难解释 但是肯定的是知乎这么大这么成功的网站完全不用我来帮他打广告 知乎
  • linux tcp ip c,Linux下TCP/IP编程--TCP实战(select)

    本文参考自徐晓鑫 后台开发 xff0c 记录之 一 为什么要使用非阻塞I O之select 初学socket的人可能不爱用select写程序 xff0c 而习惯诸如connect accept recv recvfrom这样的阻塞程序 当让
  • 串口485接法图_rs485接口接线方法

    展开全部 RS485采用差分信号负逻辑 xff0c 43 2V xff5e 43 6V表示 0 xff0c 6V xff5e 2V表示 1 62616964757a686964616fe4b893e5b19e31333365643661RS
  • can帧格式 dlc_CAN帧格式(标准帧、拓展帧)

    来源 xff1a https www cnblogs com fengliu p 9277165 html CAN2 0B标准帧 CAN 标准帧信息为11个字节 xff0c 包括两部分 xff1a 信息和数据部分 前3个字节为信息部分 位置
  • c++发送soap协议报文_软件间对接时,常用的接口类型及协议有哪些?

    软件系统之间的接口是实现一个系统跟另外系统进行信息交互的桥梁 xff0c 接口一般分为两种 xff1a 程序内部的接口和系统对外的接口 软件接口的通常分为两类 xff1a webservice接口和http api接口 xff1a webS
  • RGB彩色图、Depth深度图

    x1f4a6 彩色图 xff0c 深度图 信息缺乏 如 xff0c 颜色相近导致位置信息丢失 x1f4a6 深度图 相近深度的物体 xff0c 因为颜色或纹理的丢失 xff0c 导致难区分 深度图并不可以直接使用 xff0c 因为深度图只能
  • 超声换能器的原理及设计_超声波焊接机模具的原理与设计(二)

    一只焊头的使用寿命关键决定于两个方面 xff1a 材料 工艺 材料方面 xff1a 超声波焊接要求金属材料有柔顺性好 声波传递过程中机械损耗小 好的特点 xff0c 所以最常用的材料为铝合金及钛合金 xff0c 材料是保证超声波模具寿命于熔
  • request python_Python request使用方法及问题总结

    一 总结说明 模拟postman访问接口 xff0c 具体参照七 python接口开发 xff08 二 xff09 gt gt 三 postman访问接口 本篇文章调用的接口 xff0c 也是来自于接口开发的源码 xff0c 阅读本篇文章最
  • rtk定位权限_RTK定位原理概述

    精品文档 一 RTK 定位原理概述 RTK 测量利用的是载波相位差分 GPS 技术来实时定位的 xff0c 正是凭 借差分改正和载波相位测距两种测量方法才使得动态定位的精度可 以达到厘米级 差分 GPS 技术是利用了基准站与流动站之间空间的
  • 给视频加字幕HTML代码,给Html5视频播放器添加字幕

    现在各种支持HTML5的浏览器都能够播放html5视频了 xff0c 但是对于字幕的支持却很少 xff0c 我们期待像DVD那样强大的字幕 往往我们还不得不通过js来做 xff0c 着实是一件痛苦的事情 现在IE10率先对HTML5 Vid
  • cmake 指定头文件路径_CMake教程(一)

    CMake官方文档 xff1a https cmake org cmake help v3 17 guide tutorial index html adding system introspection step 5 CMake的优点 高
  • Adam优化器

    Adam优化算法是一种对随机梯度下降法的扩展 简单来说 xff0c Adam是带动量的梯度下降算法和RMSProp算法的结合 对梯度的一阶矩估计 xff08 First Moment Estimation xff0c 即梯度的均值 xff0
  • C++输入至回车结束

    之前比赛被这个小问题难住了 xff0c 好坑啊 其实很简单 xff1a while cin gt gt a if cin get 61 61 39 n 39 break 举例 xff1a include lt bits stdc 43 43
  • c语言单片机串口通讯,单片机C语言之串口通信协议

    串口通信概述 串口通信指串口按位 bit 发送和接收字节 尽管比按字节 byte 的并行通信慢 xff0c 但是串口可以在使用一根线发送数据的同时用另一根线接收数据 常用三种串口通信协议 1 RS 232 RS 232 ANSI EIA 2

随机推荐