欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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;
}

结果:

emplace_back与push_back的区别

那么,把Text的移动构造函数注释掉,结果如下,push_back()会调用拷贝构造函数:

emplace_back与push_back的区别

 

相关标签: C++