记录不会的方法操作(C++)——容器后面插入一个容器的值

1.将一个容器中的值全部追加在另一个容器后面

记录起因:我想要将一个vector中的值全部追加到另一个vector后面,于是我想到了push_back这个函数,但是好像它一次只能在vector末尾插入一个值。而我上网搜索,也只能发现在前面插入的方法,并没有讲该如何在后面插入,即使是在末尾插入,也只是列出push_back操作。兴许是我太笨,无法领略其中精髓。因此,我就很疑惑,这种操作该如何实现呢?于是,有了此篇。为了节约大家时间,我直接把我当下想出的实现列在这里,例子如下:

    std::vector<int> m1 = { 1, 3, 5, 7 };std::vector<int> m2 = { 2, 4, 6, 8 };m2.insert(m2.begin(), m1.begin(), m1.end());m1.assign(m2.begin(), m2.end());for (auto i : m1) {std::cout << i << " ";}std::cout << std::endl;

结果:1 3 5 7 2 4 6 8

以上是我当下的实现,但是我觉得这种实现兴许效率不会很高,但是足够用了,也并没有写的很复杂对吧。

这里解释一下这个例子:将m2中的元素全部插入m1末尾。首先根据记录不熟悉的函数用法(C++)——insert这篇文章对insert函数的详细讲解,我们可以知道insert操作只会在某个迭代器之前插入,不会在迭代器之后插入。所以,倘若直接将m1的全部元素用insert插入到m1的全部元素之前,是不是等价于将m2的元素全部插入到m1的全部元素之后呢。因此,这样就使得在m2中的元素是符合我的需求的。但是我需要的是,在m1中实现该过程,于是,便使用assign函数(记录不熟悉的函数用法(C++)——assign)将m2中的元素全部赋值给m1,因而实现将一个容器中的值全部追加在另一个容器后面的操作。

以上操作也算是将前面讲解的assign函数和insert函数的概念再过一遍。

但是,以上方法有个很明显的缺点,那就是改变了m2中的值,这是不好的。于是,在刚刚写以上内容的时候,突然想到了一个更简单的方式。例子如下:

	std::vector<int> m1 = { 1, 3, 5, 7 };std::vector<int> m2 = { 2, 4, 6, 8 };m1.insert(m1.end(), m2.begin(), m2.end());for (auto i : m1) {std::cout << i << " ";}std::cout << std::endl;

结果:1 3 5 7 2 4 6 8

解释:这里直接在m1的末尾之前插入即可,这种操作很简单便捷。

既然都写到这里了,会不会有人想知道书上是否有相关操作的记载呢?有的有的,在实现以上操作之前,我先翻看了书,觉得其操作甚是麻烦,这才自己琢磨。于是在《C++ Primer》第十章中“介绍back_inserter”这一节中找到了相应操作方式,描述如下:

一种保证算法有足够元素空间来容纳输出数据的方法是使用插入迭代器(insert iterator)。插入迭代器是一种向容器中添加元素的迭代器。

如果不能理解这句话,书上则继续对这句话进行了解释,如下:

通常情况下,当我们通过一个迭代器向容器元素赋值时,值被赋予迭代器指向的元素。而当我们通过一个插入迭代器赋值时,一个与赋值相等的元素被添加到容器中。

我的解释,就是这个insert iterator 它就是一个给你指位置的定位器,它指哪,你的值就得放置在哪个位置。

接下来,介绍了iterator头文件中的back_inserter,如下:

back_inserter接受一个指向容器的引用,返回一个与该容器绑定的插入迭代器。当我们通过此迭代器赋值时,赋值运算符会调用push_back将一个具有给定值的元素添加到容器中:

vector<int> vec; //空向量

auto it = back_inserter(vec); //通过它赋值会将元素添加到vec中

*it = 42; //vec中现在有一个元素,值为42

上面这段是不是很像在描述指针的作用呢?那么继续,

我们常常使用back_inserter来创建一个迭代器,作为算法的目的位置来使用。例如:

vector<int> vec; //空向量

fill_n(back_inserter(vec), 10, 0); //添加10个元素到vec

以上fill_n(back_inserter(vec), 10, 0)就是我们想要的操作了,但是看起来不怎么贴合我上面的题意。继续看对fill_n函数的解释

在每步迭代中,fill_n向给定序列的一个元素赋值。由于我们传递的参数是back_inserter返回的迭代器,因此每次赋值都会在vec上调用push_back。最终,这条fill_n调用语句向vec的末尾添加了10个元素,每个元素的值都是0.

这里好像确实是不贴合题意的,后续我经过查找,发现确实没有可以通过fill_n函数将一个容器的值插入另一个容器的用法。我对此进行了测试,报错,代码如下:

    std::vector<int> m1 = { 1, 3, 5, 7 };std::vector<int> m2 = { 2, 4, 6, 8 };fill_n(back_inserter(m1), m2.size(), m2);for (auto i : m1) {std::cout << i << " ";}std::cout << std::endl;

报错提示:C2679 二元“=”:没有找到接受“const _Ty”类型的右操作数的运算符(或没有可接受的转换)

于是,我打开了源码,这里只展示一下,不做解释,因为我尚未涉及对此的研究,只是解释一下const _Ty的出处。如下:

template <class _OutIt, class _Diff, class _Ty>
_CONSTEXPR20 _OutIt fill_n(_OutIt _Dest, const _Diff _Count_raw, const _Ty& _Val) {// copy _Val _Count times through [_Dest, ...)_Algorithm_int_t<_Diff> _Count = _Count_raw;if (0 < _Count) {if constexpr (_Is_vb_iterator<_OutIt, true>) {const auto _Last = _Dest + static_cast<typename _OutIt::difference_type>(_Count);_Fill_vbool(_Dest, _Last, _Val);return _Last;} else {auto _UDest = _Get_unwrapped_n(_Dest, _Count);
#ifdef __cpp_lib_is_constant_evaluatedif (!_STD is_constant_evaluated())
#endif // __cpp_lib_is_constant_evaluated{if constexpr (_Fill_memset_is_safe<decltype(_UDest), _Ty>) {_Fill_memset(_UDest, _Val, static_cast<size_t>(_Count));_Seek_wrapped(_Dest, _UDest + _Count);return _Dest;} else if constexpr (_Fill_zero_memset_is_safe<decltype(_UDest), _Ty>) {if (_Is_all_bits_zero(_Val)) {_Fill_zero_memset(_UDest, static_cast<size_t>(_Count));_Seek_wrapped(_Dest, _UDest + _Count);return _Dest;}}}for (; 0 < _Count; --_Count, (void) ++_UDest) {*_UDest = _Val;}_Seek_wrapped(_Dest, _UDest);}}return _Dest;
}

总结,如果想要实现将一个容器的值插入另一个容器就只用我上面写的方法就好,或者还有一个复杂一点的方法就是用for循环一个个赋值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/4950.shtml

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

相关文章

03-JAVA设计模式-解析器模式

解释器模式 什么是解析器模式 在Java中&#xff0c;解释器模式&#xff08;Interpreter Pattern&#xff09;是一种行为设计模式&#xff0c;它给定一个语言&#xff0c;定义它的文法的一种表示&#xff0c;并定义一个解释器&#xff0c;该解释器使用该表示来解释语言中的句子…

Linux提权--SUID提权内核漏洞本地用户提权

免责声明:本文仅做技术交流与学习,请不要乱搞破坏... 目录 SUID提权 漏洞成因 提权过程: 手工命令探针: 参考利用&#xff1a; 脚本探针: LinEnum.sh traitor linuxprivchecker等等... Linux命令的利用: find命令 利用nc反弹 利用python反弹--棱角 内核漏洞本地用…

电磁兼容(EMC):生产的ESD防护要点及措施

目录 1. 接地和连接系统 2. 操作员及工作区域 3. 地板 4. 座椅 5. 防静电车间 早期电子产品出现质量问题有80%的问题都是生产过程静电所引起的。随着ESD的管理程序系统的普及&#xff0c;ESD问题相当减小很多。例如当今的S20.20静电控制程序产生于IBM内部审核和控制系统。…

打不完!真的打不完!海量用户线索车企该怎么办?用AI!

当车企面临海量用户线索&#xff0c;怎么找到精准用户&#xff1f;大量的电话根本打不完&#xff0c;这种情况怎么办&#xff1f;建议借助AI&#xff0c;降本增效。下面以某车企为例来帮助大家解决这个难题&#xff01; 某车企面临的问题主要有三点 第一&#xff1a;车企有来自…

罗德与施瓦茨矢量网络分析仪ZNB20相位一致性

矢量网络分析仪(VNA)是电子测量领域中非常重要的一类仪器,广泛应用于射频和微波电路的测试与分析。其中,德国罗德与施瓦茨公司生产的ZNB20型号是一款性能出色的矢量网络分析仪,深受业内人士的青睐。本文将重点介绍ZNB20在相位测量方面的特点和优势,为用户提供全面的使用参考。 …

微信红包架构

文章目录 包发抢拆抢红包——拆包算法——要解决并发问题那怎么做呢&#xff1f;——预分配红包预分配怎么实现呢&#xff1f;redis集群解决日均百亿级但微信没有用预分配方案哦——内存消耗过大——cas查询红包领取记录会很频繁的查询&#xff0c;从redis中查询hash&#xff0…

软考易错题

一.数据库的设计过程&#xff0c;按照规范的设计方法&#xff0c;一般分为以下六个阶段: ①需求分析:分析用户的需求&#xff0c;包括数据、功能和性能需求; ②概念结构设计:主要采用E-R模型进行设计&#xff0c;包括画E- R图; ③逻辑结构设计:通过将E-R图转换成表&#xff…

android11 加入GMS后修改launcher图标顺序

使用的launcher \vendor\partner_gms\apps\SearchLauncher 使用的布局 vendor\partner_gms\apps\GmsSampleIntegration vendor\partner_gms\apps\GmsSampleIntegration\res_dhs_full\xml <folder title"string/google_folder_title" container"-101"…

DOS比较运算符及常用操作

目录 rem 比较运算符:事例批处理 数值计算与大小比较注释比较大小if语句while循环输出到屏幕输出到文本读取文本到剪切板删除文件暂停关闭回显 rem 比较运算符: EQU - 等于 NEQ - 不等于 LSS - 小于 LEQ - 小于或等于 GTR - 大于 GEQ - 大于或等于 例如 if not %in%2 goto 2 如…

Spring 之 MatchingStrategy

在Spring框架的上下文中&#xff0c;MatchingStrategy 特别指代处理URL路径匹配的方法策略。这是Spring MVC中一个关键的概念&#xff0c;用于决定HTTP请求的URL路径应当如何与控制器&#xff08;Controller&#xff09;中的请求映射&#xff08;RequestMapping&#xff09;进行…

Google Cloud 的 AI 超计算机架构的新增功能

跳转到内容 云 博客 解决方案与技术 生态系统 开发者与从业者 借助 Google Cloud 进行转型 联系销售人员 免费开始使用 计算 文章来自于谷歌云 Google Cloud 的 AI 超计算机架构的新增功能 2024 年 4 月 10 日 https://storage.googleapis.com/gweb-cloudblog-publish/images/…

字符串的格式化输出、索引和切片以及7个常用的函数的使用

1.字符串的格式化输出: f-string 是一种方便的字符串格式化方式&#xff0c;可以直接在字符串中嵌入变量。2. name "Alice" age 30 print(f"My name is {name} and I am {age} years old.") 2.索引和切片: 索引和切片是用来访问字符串中的特定字符或…

Blob对象实现文件下载

首先&#xff0c;要有下载按钮 <a download onClick{()> downloadAttentment(data)}>下载</a>其次&#xff0c;定义下载function // 此处去处理 blob 对象 const downloadStreamByATag (data, suffix, name) > {if (suffix void 0) { suffix xls; }if (…

Python数据结构与算法(1):将序列分解为单独的变量

问题 现在有一个包含 N 个元素的元组或者是序列&#xff0c;怎样将它里面的值解压后同时赋值给 N 个变量&#xff1f; 解决方案 任何的序列&#xff08;或者是可迭代对象&#xff09;可以通过一个简单的赋值操作来分解为单独的变量。 唯一的要求就是变量的总数和结构必须与序…

JAVASE 数组相关知识

递归 A方法调用B方法&#xff0c;我们很容易理解 递归就是:A方法调用A方法&#xff0c;即自己调用自己 利用递归可以用简单的程序来解决一些复杂的问题。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解&#xff0c;递归策略只需少量的程序就可…

一个人可能代表一群人

最近有个小伙伴问他是做货代的&#xff0c;怎么能找到自己的客户&#xff1f;刚看到这个问题的时候&#xff0c;觉得这个不属于自己的范围&#xff0c;因为自己不是做货代的&#xff0c;怎么知道他们怎么工作&#xff0c;怎么去搜索客户呢&#xff1f; 但是仔细想来&#xff0…

【Java EE】日志框架(SLF4J)与门面模式

文章目录 &#x1f340;SLF4j&#x1f333;门面模式(外观模式)&#x1f338;门面模式的定义&#x1f338;门面模式的模拟实现&#x1f338;门面模式的优点 &#x1f332;关于SLF4J框架&#x1f338;引入日志门面 ⭕总结 &#x1f340;SLF4j SLF4J不同于其他⽇志框架,它不是⼀个…

跟TED演讲学英文:AI isn‘t as smart as you think -- but it could be by Jeff Dean

AI isn’t as smart as you think – but it could be Link: https://www.ted.com/talks/jeff_dean_ai_isn_t_as_smart_as_you_think_but_it_could_be Speaker: Jeff Dean Jeffrey Adgate “Jeff” Dean (born July 23, 1968) is an American computer scientist and software…

【服务器部署篇】Linux下快速安装Jenkins

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0c;产…

微前端micro-app 子应用 调用父应用方法

参考&#xff1a;micro-app官方文档 场景描述 父应用存储一套vuex数据&#xff0c;其中包含登录信息token等&#xff0c;登录信息透传给子应用使用。 当子应用中的接口返回“登录失效”时&#xff0c;需要清空父应用vuex中的登录相关信息&#xff0c;并且跳转到登录页面。 原…