对于vector容器,我们现在已经很熟悉尾插法push_back()和emplace_back()了,并且我们还知道在面对复杂对象的时候,使用emplace_back()的效率更高。但是当我们需要在vector内其他位置插入元素,该怎么办呢?别着急,insert()或emplace()能够帮助你解决这个问题。vector里,insert()和emplace()都能够在指定位置前插入元素,相同点是他们的第一个参数有且只能是位置迭代器,不同点在于insert()能实现多个插入,而emplace()只能实现单个插入。其原因也很简单,上一章《都c++11了,还有人不知道emplace_back()?》我们简单讨论了emplace_back()成员函数,其功能是直接在尾部构造对象,避免多余移动,由于对象只能是单个,所以emplace()只能支持单个元素。而insert可以既可以插入n个相同的数,又能通过{}插入多个不同的数。下面我将分别展示insert()和emplace()的插入方法:
#include<bits/stdc++.h> using namespace std; /*通过insert()插入单个或多个元素*/ void test_insert() { cout << "通过insert()进行插入语元素操作:\n"; vector<int> v{1,2,3,4,5}; /*方法1,假如要在第三个元素前插入一个元素0*/ v.insert(v.begin()+2,0); cout << "插入元素成功,此时第3个元素是:" << v[2] << '\n'; /*方法2,假如要在第三个元素前插入5个6*/ v.insert(v.begin()+2,3,6); cout<<"能够看到0前面有3个6:\n"; for(int i=0;i<v.size();++i)cout << v[i] << " "; cout << '\n'; /*方法3,假如要在第三个元素前插入7、8、9、这三个元素*/ v.insert(v.begin()+2,{7,8,9}); cout<<"能够看到6前面有7、8、9:\n"; for(int i=0;i<v.size();++i)cout << v[i] << " "; cout << '\n'; cout << '\n'; } /*通过emplace()插入单个元素*/ void test_emplace() { cout << "通过emplace()进行插入语元素操作:\n"; vector<int> v{1,2,3,4,5}; /*假如要在第三个元素前插入一个元素0*/ v.emplace(v.begin()+2,0); cout << "插入元素成功 此时第3个元素是" << v[2] << '\n'; } int main(){ test_insert(); test_emplace(); return 0; }
代码运行后结果belike:
可以看到,我们的已经成功完成了插入元素要求。其实插入语法也不难,没必要死记硬背,能用就行,总结以下就三点:
1. 如果是插入单个元素,选emplace()无疑,直接构造对象避免移动和析构。
2. 如果需要插入多个元素,选insert()没错,单个元素、多个元素、n个相同元素满足个性化需要。
3. 不管怎样,第一个参数必须记住是位置迭代器!
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程