C++ STL vector插入元素(insert()和emplace())详解
另外,如果想实现在 vector 容器尾部添加元素,可阅读《vector添加元素》一节。
insert()
insert() 函数的功能是在 vector 容器的指定位置插入一个或多个元素。该函数的语法格式有多种,如表 1 所示。语法格式 | 用法说明 |
|---|---|
iterator insert(pos,elem) | 在迭代器 pos 指定的位置之前插入一个新元素elem,并返回表示新插入元素位置的迭代器。 |
iterator insert(pos,n,elem) | 在迭代器 pos 指定的位置之前插入 n 个元素 elem,并返回表示个新插入元素位置的迭代器。 |
iterator insert(pos,first,last) | 在迭代器 pos 指定的位置之前,插入其他容器(不仅限于vector)中位于 [first,last) 区域的所有元素,并返回表示个新插入元素位置的迭代器。 |
iterator insert(pos,initlist) | 在迭代器 pos 指定的位置之前,插入初始化列表(用大括号{}括起来的多个元素,中间有逗号隔开)中所有的元素,并返回表示个新插入元素位置的迭代器。 |
下面的例子,演示了如何使用 insert() 函数向 vector 容器中插入元素。
#include <iostream>
#include <vector>
#include <array>
using namespace std;
int main()
{
std::vector<int> demo{1,2};
//种格式用法
demo.insert(demo.begin() + 1, 3);//{1,3,2}
//第二种格式用法
demo.insert(demo.end(), 2, 5);//{1,3,2,5,5}
//第三种格式用法
std::array<int,3>test{ 7,8,9 };
demo.insert(demo.end(), test.begin(), test.end());//{1,3,2,5,5,7,8,9}
//第四种格式用法
demo.insert(demo.end(), { 10,11 });//{1,3,2,5,5,7,8,9,10,11}
for (int i = 0; i < demo.size(); i++) {
cout << demo[i] << " ";
}
return 0;
}
运行结果为:
1 3 2 5 5 7 8 9 10 11
emplace()
emplace() 是 C++ 11 标准新增加的成员函数,用于在 vector 容器指定位置之前插入一个新的元素。
该函数的语法格式如下:再次强调,emplace() 每次只能插入一个元素,而不是多个。
iterator emplace (const_iterator pos, args...);
其中,pos 为指定插入位置的迭代器;args... 表示与新插入元素的构造函数相对应的多个参数;该函数会返回表示新插入元素位置的迭代器。
简单的理解 args...,即入元素的构造函数需要多少个参数,那么在 emplace() 的个参数的后面,就需要传入相应数量的参数。
举个例子:
#include <vector>
#include <iostream>
using namespace std;
int main()
{
std::vector<int> demo1{1,2};
//emplace() 每次只能插入一个 int 类型元素
demo1.emplace(demo1.begin(), 3);
for (int i = 0; i < demo1.size(); i++) {
cout << demo1[i] << " ";
}
return 0;
}
运行结果为:
3 1 2
既然 emplace() 和 insert() 都能完成向 vector 容器中插入新元素,那么谁的运行效率更高呢?答案是 emplace()。在说明原因之前,通过下面这段程序,就可以直观看出两者运行效率的差异:
#include <vector>
#include <iostream>
using namespace std;
class testDemo
{
public:
testDemo(int num) :num(num) {
std::cout << "调用构造函数" << endl;
}
testDemo(const testDemo& other) :num(other.num) {
std::cout << "调用拷贝构造函数" << endl;
}
testDemo(testDemo&& other) :num(other.num) {
std::cout << "调用移动构造函数" << endl;
}
testDemo& operator=(const testDemo& other);
private:
int num;
};
testDemo& testDemo::operator=(const testDemo& other) {
this->num = other.num;
return *this;
}
int main()
{
cout << "insert:" << endl;
std::vector<testDemo> demo2{};
demo2.insert(demo2.begin(), testDemo(1));
cout << "emplace:" << endl;
std::vector<testDemo> demo1{};
demo1.emplace(demo1.begin(), 1);
return 0;
}
运行结果为:
insert:
调用构造函数
调用移动构造函数
emplace:
调用构造函数
可以看到,通过 insert() 函数向 vector 容器中插入 testDemo 类对象,需要调用类的构造函数和移动构造函数(或拷贝构造函数);而通过 emplace() 函数实现同样的功能,只需要调用构造函数即可。注意,当拷贝构造函数和移动构造函数同时存在时,insert() 会优先调用移动构造函数。
简单的理解,就是 emplace() 在插入元素时,是在容器的指定位置直接构造元素,而不是先单独生成,再将其(或移动)到容器中。因此,在实际使用中,大家优先使用 emplace()。
- 随机文章
- 马尔代夫海拔地图(马尔代夫海拔图:掌握海岛地貌的关键 最多)
- 南航马尔代夫机票(南航新年特惠,马尔代夫机票大促销!)
- 保定阜平马尔代夫(保定阜平有望成为马尔代夫新航线起点)
- 马尔代夫几类地区(马尔代夫地区分类及建议旅游计划)
- 成都马尔代夫地址(成都“马尔代夫”去哪儿?答案在这里)
- 安丘马尔代夫名单(安丘公布违规出入马尔代夫旅游黑名单)
- 成都马尔代夫风景(成都的马尔代夫:色彩斑斓的锦绣水乡)
- 李玟马尔代夫度假(歌后李玟度假马尔代夫,尽享假日时光)
- 北关 马尔代夫(北关岛:马尔代夫秘境)
- 泰州马尔代夫视频(远离喧嚣,沉浸在泰州马尔代夫视频中)
- 沈阳马尔代夫风水(沈阳一处风景别墅拥有马尔代夫般风光)
- 山城 马尔代夫(马尔代夫:一个美丽的热带天堂)
- 疫情马尔代夫国家(疫情严峻!马尔代夫全境实行封锁管制)
- 五一 马尔代夫(五一想去凉爽一下?马尔代夫等你来!)
- 美丽中国马尔代夫(远离尘嚣,沉浸美丽迈尔达斯海底世界)
- 福建东方马尔代夫(福建公司进军马尔代夫,开拓海外市场)
- 马尔代夫转盘图片(马尔代夫度假村设有令人惊叹的转盘池 重构标题:惊艳!马尔代夫度假村超炫转盘池)
- 蒙族人在马尔代夫(蒙古族文化在马尔代夫得到保护和传承)
- 邯郸马尔代夫风景(邯郸最美海岛丨马尔代夫风格海滨景观)
- 涿州马尔代夫地址(涿州首家马尔代夫主题酒店地址大揭秘)
- 玉林马尔代夫海滩(玉林尽享马尔代夫风情,海滩清新宜人)
- 邢台马尔代夫烧烤(邢台市民在马尔代夫品尝传统烧烤佳肴)
- 衡阳马尔代夫水屋(湖南衡阳首家马尔代夫风格水上屋落地)
- 阳江马尔代夫风景(阳江旅游胜地:探访仿若马尔代夫风光)
- 长沙马尔代夫介绍(长沙的马尔代夫——岳麓书院天空之城)
- 泰国品牌马尔代夫(泰国旅游品牌将开设新酒店在马尔代夫)
- 尼坤 马尔代夫(尼库姆岛:马尔代夫的珊瑚岛宝藏)
- 马尔代夫代理海洋(马尔代夫海洋代理:探秘绝美海洋文化)
- 马尔代夫中国关系(马尔代夫与中国建交谈判取得重大进展)
- 地图 马尔代夫(探索梦幻马尔代夫:美丽岛屿上的天堂之旅)
