记录不熟悉的函数用法(C++)——insert

2. insert

记录起因:接上一篇的例子,不知道为什么使用insert进行插入之前要先执行clear操作,非得这么做吗?我可以认为这个clear操作是对应于为空字符串的,可是仍然纠结insert它具体插入的位置,在后面追加还是重头插入呢,还是说如果要重头插入就必须先进行clear操作,这都是我的疑惑。还有一个原因是我确实不是很清楚insert函数具体的用法。例子如下:

list<string> slist;
slist.clear();
slist.insert(slist1.begin(), 10, "Hiya!");

因此,又继续翻开《C++ Primer》第十一章中“添加元素”这节,具体描述如下:

关联容器的insert成员向容器中添加一个元素或一个元素范围。

注意:由于map和set(以及相对应的无序类型)包含不重复的关键字,因此插入一个已存在的元素对容器没有任何影响。

解释一下这里的意思:插入一个已经在容器中存在的元素,容器是不会执行插入操作的,因此对容器本身不存在影响。

下面是一个例子,刚好可以解释我的疑惑,如下:

vector<int> ivec = {2, 4, 6, 8, 2, 4, 6, 8};  //ivec有8个元素

set<int> set2;  //空集合

set2.insert(ivec.cbegin(), ivec.cend());  //set2中有4个元素

set2.insert({1, 3, 5, 7, 1, 3, 5, 7}); //set2现在有8个元素

那么书上已经给出了解答,insert在插入中是追加的,并不是重头开始。如果要替换赋值操作的话,应是需要先执行clear操作的。

那么继续,书上给出了关于insert用法的解释,如下:

insert有两个版本,第一个是 接受一对迭代器,也就是上文中的 | set2.insert(ivec.cbegin(), ivec.cend()); | 。 第二个是 接受一个初始化器列表,也就是上文中的 | set2.insert({1, 3, 5, 7, 1, 3, 5, 7}); | 。 这两个版本的行为类似对应的构造函数——对于一个给定的关键字,只有第一个带此关键字的元素才被插入到容器中。

以上解释,只解决了我对于使用insert插入set的疑惑,好像并没有针对vector的插入进行解释。于是经过一番查找,我继续翻看了《C++ Primer》第9章中“向顺序容器添加元素”这一节,描述如下:

上一节介绍了所有容器都支持的操作。

这里翻看了上一节中所有容器都支持的操作,其中就包括了insert操作,于是继续

除array外,所有标准库容器都提供灵活的内存管理。在运行时可以动态添加或删除元素来改变容器大小。

其中,对insert的解释:

1. c.insert(p, t): 在迭代器p指向的元素之前创建一个值为t或由args创建的元素。返回指向新添加元素的迭代器。 这里我的理解是在p指向的位置之前,添加一个值为t的元素或者是有args创建的元素。这里的args,我搜索了好久的资料,网上几乎没有很详细的解释,最后用AI搜了一下,大概意思是args是一个变量或者是可以理解为函数里面的形参。

但是,我仍然觉得这个对于args的解释不是很透彻,因为我测试了如下例子,不论是传入m1还是m2都是报错的,显示没有与之匹配的函数,如下:

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

结果:直接报错。

这个解释问题暂且搁置,之后有新的理解,会再出一篇解释。

继续解释:

2. c.insert(p, n, t): 在迭代器p指向的元素之前插入n个值为t的元素,返回指向新添加的第一个元素的迭代器。若n为0,则返回p。

3. c.insert(p, b, e): 将迭代器b和e指定范围内的元素插入到迭代器p指向的元素之前。b和e不能指向c中的元素。返回指向新添加的第一个元素的迭代器;若范围为空则返回p。

这里解释一下:这里的b和e不能是指向c的,更简易地说,p与 b、e指向的是两个不同的容器对象。

4. c.insert(p, il): il是一个花括号包围的元素值列表。将这些给定值插入到迭代器p指向的元素之前。返回指向新添加的第一个元素的迭代器;若列表为空,返回p。

测试例子如下:

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

结果:1 2 3 4 5 6 9 9 9 9 9

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

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

相关文章

Sentinel 与 Hystrix:云原生时代的故障隔离与服务降级

在面对高流量和复杂的分布式系统时&#xff0c;保障服务的稳定性和可用性是至关重要的。故障隔离和服务降级是两种常用的技术手段&#xff0c;用来保护系统在面临故障或压力过大时仍能稳定运行。在这方面&#xff0c;Sentinel 和 Hystrix 是两个广泛使用的库&#xff0c;它们虽…

2398.预算内最多的机器人数目

我第一个手搓的hard的单调队列题目......灵神yyds 思路解析: 我做的时候感觉这个题目有点歧义,我以为他的连续运行是时间上连续,所以我开始写的代码是选择最多的子序列(可以不连续),使得不超过budget,这个求最多子序列的代码会在最后给出,不保证完全正确(因为没有太多测试点),…

element-ui et -i 编译默认主题报错:ReferenceError: primordials is not defined

报错信息如下 fs.js:40 } primordials;^ ReferenceError: primordials is not defined导致这个问题的原因&#xff1a;node和gulp版本冲突&#xff01;&#xff01; 我使用的是node 14版本 解决方法&#xff1a; 看了好几个帖子&#xff0c;都推荐使用node 11.15.0版本&am…

华为ensp中BGP(边界网关协议)基础原理及配置命令

作者主页&#xff1a;点击&#xff01; ENSP专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年4月27日10点04分 BGP&#xff08;边界网关协议&#xff09;是一种路由协议&#xff0c;用于在互联网中的不同自治系统&#xff08;AS&#xff09;之间交换路由信息。它…

WordPress外贸独立站如何提高询盘转化率

一、引言 在当今全球化日益加剧的商业环境中&#xff0c;外贸业务已成为众多企业寻求增长的重要途径。而WordPress作为一款强大且易于操作的建站平台&#xff0c;被广大外贸企业所青睐&#xff0c;用于构建自己的独立站。然而&#xff0c;仅仅拥有一个WordPress外贸独立站并不…

eCognition 分类

目录 前言 一、阈值分类 1、创建自定义特征 2、查看对象特征值 3、阈值分类 3.1 新建类别(如果已有类别即跳过) 3.2、建立分类阈值规则 4、导出分类结果 5、附录:如果需要合并结果、按以下步骤 二、监督分类 1、方法1:利用classification算法(主要用于最邻近)…

芯片安全(security)

芯片安全包括什么 芯片安全是为了防止芯片数据和程序遭遇非法攻击和访问等导致数据错误或者信息泄露或者非正常运行&#xff1f; 比如指纹信息被泄露&#xff1b;PC被植入非法挖矿程序&#xff1b;非法修改ddr中的数据等。 1.在子系统级别看到的axprot[1]和nsaid(non-securit…

sparkctl x86/arm不同平台编译使用

目录 1.sparkctl简介 2.环境准备 3.sparkctl编译 1.sparkctl简介 sparkctl是 Spark Operator 的一个命令行工具,用于创建、列出、检查状态、获取日志和删除SparkApplication。它还可以进行从本地端口到 Spark Web UI 端口的端口转发,以访问驱动程序上的 Spark Web UI。每个…

Python中实现多层感知机(MLP)的深度学习模型

深度学习已经成为机器学习领域的一个热门话题&#xff0c;而多层感知机&#xff08;MLP&#xff09;是最基础的深度学习模型之一。在这篇教程中&#xff0c;我将向你展示如何使用Python来实现一个简单的MLP模型。 什么是多层感知机&#xff08;MLP&#xff09;&#xff1f; 多…

java 中String、StringBuffer、StringBuilder有什么区别

String 了构造和管理字符串的各种基本逻辑。它是典型的 Immutable 类&#xff0c;被声明成为 final class&#xff0c;所有属性也都是 final 的。也由于它的不可变性&#xff0c;类似拼接、裁剪字符串等动作&#xff0c;都会产生新的 String 对象。由于字符串操作的普遍性&…

浅谈操作系统中的重要概念——线程

文章目录 一、进程概念产生的原因二、进程的弊端三、线程3.1、线程复用结构体PCB3.2、多线程弊端3.2.1、拖慢程序的效率3.2.2、产生线程安全问题3.2.3、导致整个进程终止 3.3、怎么判断一个线程是否执行完毕&#xff1f;&#xff1f;3.4、怎么终止一个线程&#xff1f;&#xf…

【学习笔记二十八】EWM和QM集成的后台配置和前台展示

一、EWM和QM集成概述 SAP EWM(扩展仓库管理)和QM(质量管理)的集成是SAP系统中一个重要的特性,它允许企业在仓库管理过程中实现质量控制和检验流程的自动化。以下是关于EWM和QM集成的一些关键点概述: 集成优势:通过集成,企业可以确保仓库中的物料在收货、存储、…

csdn的复制代码功能如何实现

页面布局分析&#xff1a; 按钮在文本框里面&#xff0c;所以文本框是父元素&#xff0c;按钮是子元素。要使得按钮在文本框的右上角&#xff0c;需要使用绝对定位。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8">…

实现ALV页眉页脚

1、文档介绍 在ALV中&#xff0c;可以通过增加页眉和页脚&#xff0c;丰富ALV的展示。除了基本的页眉和页脚&#xff0c;还可以通过插入HTML代码的方式展示更加丰富的页眉和页脚&#xff0c;本篇文章将介绍ALV和OOALV中页眉页脚的使用。 2、ALV页眉页脚 效果如下 2.1、显示内…

【Ubuntu20.04+gcc-9.4.0】Openface在linux下的详细环境配置(2024.4月)

近期&#xff0c;需要使用openface来进行人脸的crop&#xff0c;因此踩坑配置出在ubuntu20.04下的具体流程。话不多说&#xff0c;直接进入主题。 务必注意&#xff0c;按照顺序执行&#xff0c;否则很大概率报错&#xff01;&#xff01;&#xff01;1. 安装GCC&#xff0c;我…

长图高效切割新体验:支持按随机宽度灵活裁切,释放无限创意与效率

图像的传播已经成为我们日常生活的一部分。而长图&#xff0c;作为一种特殊的图像形式&#xff0c;其独特的展示方式能够吸引更多的目光。但是&#xff0c;如何将长图高效切割&#xff0c;以展现其独特的魅力呢&#xff1f;现在&#xff0c;我们为您带来了一款支持按随机宽度切…

怎么找回录音文件?这4个方法实用又简单!

“我有一份比较重要的录音文件保存在电脑上了&#xff0c;不知道是因为误删还是什么原因&#xff0c;这个文件丢失了&#xff0c;我现在有什么比较好的方法可以找回这个文件吗&#xff1f;” 录音文件是我们日常生活中经常使用的文件类型&#xff0c;无论是会议记录、学习笔记还…

论机器学习(ML)在网络安全中的重要性

机器学习是什么&#xff1f; 机器学习(ML)是人工智能的一个分支&#xff0c;它使用算法来使计算机系统能够自动地从数据和经验中进行学习&#xff0c;并改进其性能&#xff0c;而无需进行明确的编程。机器学习涉及对大量数据的分析&#xff0c;通过识别数据中的模式来做出预测…

分享AIGC技术在各个领域的应用情况,以及对未来社会的影响和可能发展方向

AI生成内容&#xff08;AIGC&#xff09;技术已经在多个领域显示出其革命性的潜力&#xff0c;包括艺术、媒体、教育、科学研究、娱乐和更多。这些技术的应用不仅改变了内容创造的方式&#xff0c;还预示着对社会、经济和文化结构的深远影响。以下是AIGC技术在各领域的应用情况…

MySQL/MariaDB 如何查看当前的用户

MySQL 的所有数据库用户信息是存储在 user 数据表中的。 可以在登录成功数据后运行 SQL&#xff1a; MariaDB [(none)]> select user,host from user;就可以查看到数据中的所有用户信息。 MariaDB [(none)]> select user,host from user; ERROR 1046 (3D000): No databa…