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

server/2024/11/24 8:33:44/

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.ppmy.cn/server/20861.html

相关文章

C# Solidworks二次开发:枚举应用实战(第四讲)

大家好&#xff0c;今天还是介绍我们的枚举系列&#xff0c;紧接上一讲。 下面是要介绍的枚举&#xff1a; &#xff08;1&#xff09;第一个为swAutodimstatus&#xff0c;这个枚举的含义为返回草图和制图自动标准状态&#xff0c;下面是官方的具体枚举值&#xff1a; Memb…

Docker数据管理+镜像的创建

Docker容器数据管理方式 数据卷 数据卷是一个供容器使用的特殊目录&#xff0c;位于容器中&#xff0c;可将宿主的目录挂载到数据卷上&#xff0c;对数据卷的修改操作立即可见&#xff0c;并且更新数据不会影响镜像&#xff0c;从而实现数据在宿主机与容器之间的迁移。数据卷…

毕业撒花 流感服务小程序的设计与实现

目录 1.1 总体页面设计 1.1.1 用户首页 1.1.2 新闻页面 1.1.3 我的页面 1.1.5 管理员登陆页面 1.1.6 管理员首页 1.2 用户模块 1.2.1 体检预约功能 1.2.2 体检报告功能 1.2.4 流感数据可视化功能 1.2.5 知识科普功能 1.2.6 疾病判断功能 1.2.7 出示个人就诊码功能 …

数据库变更时,OceanBase如何自动生成回滚 SQL

背景 在开发中&#xff0c;数据的变更与维护工作一般较频繁。当我们执行数据库的DML操作时&#xff0c;必须谨慎考虑变更对数据可能产生的后果&#xff0c;以及变更是否能够顺利执行。若出现意外数据丢失、操作失误或语法错误等情况&#xff0c;我们必须迅速将数据库恢复到变更…

数据结构习题--旋转链表

数据结构习题–旋转链表 给你一个链表的头节点 head &#xff0c;旋转链表&#xff0c;将链表每个节点向右移动 k 个位置。注意这里的k可能超过链表的长度 方法&#xff1a;双指针 分析 旋转K次&#xff0c;我们其实就是相当于找到倒数第K个结点&#xff0c;让其成为头结点…

Matlab无法使用GBK编码保存文件,改用UTF-8编码(已解决)

系统不让保存GBK格式编码。但是可以通过matlab另存为 的方式保持为UTF-8编码&#xff0c;如下操作。 然后 在弹出的窗口中&#xff0c;选择 UTF-8 可以保持在与源文件相同的文件夹内&#xff0c;将源文件覆盖掉。就可以了。

【Linux】基础指令

文章目录 基础指令1. pwd 指令2. cd 指令3. ls 指令4. touch 指令5. mkdir 指令6. rmdir 和 rm 指令7. man 指令8. cp 指令9. mv 指令10. cat 指令11. more 和 less 指令12. head 和 tail 指令13. date 指令14. cal 指令15. find 指令16. grep 指令18. zip 和 unzip 指令19. ta…

Bayes判别:统计学中的经典分类方法

在统计和机器学习领域&#xff0c;Bayes判别是一个基于概率理论的强大工具&#xff0c;用于解决分类问题。它基于Bayes定理&#xff0c;通过计算和比较后验概率来进行决策。这种方法在处理不确定性和不完整数据时表现尤为出色&#xff0c;因此在医学诊断、邮件过滤、语音识别等…