emplace_back与push_back的区别
程序员文章站
2022-03-21 17:42:14
...
C++11中经常用到插入操作对stl的各种容器进行操作,比如vector,map,set等,以vector为列,当数据类型实现了移动构造函数时,push_back()插入一个右值时,会先调用构造函数创建临时对象,再调用移动构造函数将对象放置到容器中,如果数据类型没有实现移动构造函数,push_back()插入一个右值时,会先调用构造函数创建临时对象,再调用拷贝构造函数将对象放置到容器中;而emplace_back()一个右值时,都是在插入的时候直接构造对象,不需要调用移动构造函数或拷贝构造函数;如下列子:
(右值标识是临时性对象的表达式,这类对象没有指定的变量名,都是临时计算生成的)
#include <iostream>
#include <vector>
using namespace std;
struct Text
{
Text(int a_in) : a(a_in)
{
std::cout << "调用构造函数" << endl;
}
Text(const Text& test) : a(test.a)
{
std::cout << "调用拷贝构造函数" << endl;
}
Text(Text&& test) : a(test.a)
{
std::cout << "调用移动构造函数" << endl;
}
int a = 100;
};
int main()
{
std::vector<Text> vt_texts;
vt_texts.reserve(100); // 需要先与申请足够的空间,要不然开始会多看到很多拷贝构造函数的操作
vt_texts.push_back(1);
std::cout << "\n" << endl;
vt_texts.emplace_back(2);
std::cout << "\n" << endl;
return 0;
}
结果:
那么,把Text的移动构造函数注释掉,结果如下,push_back()会调用拷贝构造函数:
推荐阅读