C++ STL vector添加元素(push_back()和emplace_back())详解
在 《STL vector容器详解》一节中,已经给大家列出了 vector 容器提供的所有成员函数,在这些成员函数中,可以用来给容器中添加元素的函数有 2 个,分别是 push_back() 和 emplace_back() 函数。
有读者可能认为还有 insert() 和 emplace() 成员函数,严格意义上讲,这 2 个成员函数的功能是向容器中的指定位置插入元素,后续章节会对它们做详细的介绍。
push_back()
该成员函数的功能是在 vector 容器尾部添加一个元素,用法也非常简单,比如:
程序中,第 7 行代码表示向 values 容器尾部添加一个元素,但由于当前 values 容器是空的,因此新添加的元素 1 无疑成为了容器中元素;第 8 行代码实现的功能是在现有元素 1 的后面,添加元素 2。#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> values{};
values.push_back(1);
values.push_back(2);
for (int i = 0; i < values.size(); i++) {
cout << values[i] << " ";
}
return 0;
}
运行程序,输出结果为:
1 2
emplace_back()
该函数是 C++ 11 新增加的,其功能和 push_back() 相同,都是在 vector 容器的尾部添加一个元素。emplace_back() 成员函数的用法也很简单,这里直接举个例子:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> values{};
values.emplace_back(1);
values.emplace_back(2);
for (int i = 0; i < values.size(); i++) {
cout << values[i] << " ";
}
return 0;
}
运行结果为:
1 2
读者可能会发现,以上 2 段代码,只是用 emplace_back() 替换了 push_back(),既然它们实现的功能是一样的,那么 C++ 11 标准中为什么要多此一举呢?
emplace_back()和push_back()的区别
emplace_back() 和 push_back() 的区别,就在于底层实现的机制不同。push_back() 向容器尾部添加元素时,首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中(如果是拷贝的话,事后会自行销毁先前创建的这个元素);而 emplace_back() 在实现时,则是直接在容器尾部创建这个元素,省去了拷贝或移动元素的过程。为了让大家清楚的了解它们之间的区别,我们创建一个包含类对象的 vector 容器,如下所示:
#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;
}
private:
int num;
};
int main()
{
cout << "emplace_back:" << endl;
std::vector<testDemo> demo1;
demo1.emplace_back(2);
cout << "push_back:" << endl;
std::vector<testDemo> demo2;
demo2.push_back(2);
}
运行结果为:
emplace_back:
调用构造函数
push_back:
调用构造函数
调用移动构造函数
在此基础上,读者可尝试将 testDemo 类中的移动构造函数注释掉,再运行程序会发现,运行结果变为:
emplace_back:
调用构造函数
push_back:
调用构造函数
调用拷贝构造函数
由此可以看出,push_back() 在底层实现时,会优先选择调用移动构造函数,如果没有才会调用拷贝构造函数。显然完成同样的操作,push_back() 的底层实现过程比 emplace_back() 更繁琐,换句话说,emplace_back() 的执行效率比 push_back() 高。因此,在实际使用时,建议大家优先选用 emplace_back()。
由于 emplace_back() 是 C++ 11 标准新增加的,如果程序要兼顾之前的版本,还是应该使用 push_back()。
- 随机文章
- 斐济 马尔代夫 级别(南太平洋美丽度假胜地:斐济和马尔代夫很像的热带天堂)
- 马尔代夫高薪招聘(马尔代夫招聘高薪职位,薪酬优厚!)
- 中央直播马尔代夫(中央电视台直播报道马尔代夫政治形势)
- 沙巴 马尔代夫 新加坡(沙巴、马尔代夫、新加坡:三地旅游攻略汇总)
- 出征马尔代夫视频(视频展现:一览壮美马尔代夫出征历程)
- 云南普洱马尔代夫(云南普洱:与马尔代夫一样的度假胜地)
- 几号对阵马尔代夫(中国男足迎战马尔代夫,备战世预赛!)
- 蓝燕 马尔代夫(蓝燕在马尔代夫的奇妙旅程)
- 国足马尔代夫战术(国足战马尔代夫:实现反弹的必胜之战)
- 成都马尔代夫地址(成都“马尔代夫”去哪儿?答案在这里)
- 广州天河马尔代夫(广州马代好去处,享受浪漫短途旅行!)
- 宋茜马尔代夫裙子(宋茜马尔代夫穿搭曝光,清新仙气十足)
- 台湾 马尔代夫(台湾游客暂停前往马尔代夫)
- 德阳马尔代夫沙滩(德阳打造仿佛身处马尔代夫的美丽沙滩)
- 漳州马尔代夫美食(漳州小镇开进来,尝尝马尔代夫美食!)
- 宜都马尔代夫位置(宜都度假村:尽情享受马尔代夫美景!)
- 潢川版的马尔代夫(潢川县仿马尔代夫建水上屋,美如画!)
- 眉山马尔代夫旅游(探寻眉山马尔代夫度假胜地的奇妙之旅)
- 辉县马尔代夫鱼种(辉县领养珍贵马尔代夫鱼成为新兴爱好)
- 马尔代夫下海了吗(马尔代夫:下潜探海底世界开始火热!)
- 潭头马尔代夫改名(潭头岛美名更迭,马尔代夫又添新景象)
- 丛菲 马尔代夫(丛菲拍摄的马尔代夫风光,惊艳全球眼球)
- 韩国马尔代夫旅游(韩媒:韩国游客前往马尔代夫旅游激增)
- 挪威 马尔代夫(挪威游客去往马尔代夫:一个难忘的度假胜地)
- 挪威 马尔代夫(挪威游客再次成为马尔代夫最大客源地)
- 重庆马尔代夫河边(重庆海滨度假村,仿若置身于马尔代夫)
- 推油 马尔代夫(重构马尔代夫:新思路下的发展机遇)
- 浪漫马尔代夫图片(美丽浪漫的马尔代夫——一组壮丽图片)
- 汤院 马尔代夫(汤院:享受马尔代夫的海洋豪华度假体验)
- 马尔代夫入境深圳(深圳新增马尔代夫入境,旅游更加便利)
