容器的emplace成员函数

    在C++新标准中引入了三个新成员---emplace_front、emplace、和emplace_back,这些操作是构造而不是拷贝元素。这些操作分别对应分别是push_front、insert、push_back,允许我们将元素放在容器头部、一个指定位置之前或容器尾部。我们以下拿push_back和emplace_push来举例。其他的成员函数原理是一样的。当我们调用push_back函数时,我们将元素类型的对象当做参数传递给元素类型的赋值构造函数。而当我们调用一个emplace_back成员函数时,则是将参数传递给元素类型的相应的构造函数。emplace使用这些参数在容器管理的内存空间中直接构造函数。例如:我们自己定义一个Foo类。在类中我们自己定义了两个构造函数、一个赋值构造函数、一个重载赋值运算操作符和一个析构函数。
class Foo
{
private:
	int val;
	string str;
public:
	Foo() :val(0), str("")
	{
		cout << "默认构造函数" << endl;
	}
	Foo(int v, string s) :val(v), str(s)
	{
		cout << "两个参数的构造函数" << endl;
	}

	Foo(const Foo &rhs)
	{
		val = rhs.val;
		str = rhs.str;
		cout << "赋值构造函数" << endl;
	}

	Foo &operator=(const Foo &rhs)
	{
		val = rhs.val;
		str = rhs.str;
		cout << "赋值操作符重载" << endl;
		return *this;
	}

	~Foo()
	{
		cout << "析构函数" << endl;
	}
};
假如我们定义一个vector<Foo> ve容器。我们分别使用push_back和emplace_back成员函数向容器中添加元素。如下:
vector<Foo> ve;
ve.push_back(Foo(19, "Jay"));
ve.emplace_back(18,"Tom");
其中对emplace_back和push_back调用都会创建新的Foo对象,在调用emplace_back时,会在容器中直接创建对象,调用的是两个参数的构造函数。而调用push_back则会创建一个临时对象,然后用该临时对象作为参数传递给Foo类型的赋值构造函数。最后析构该临时对象。输出结果如下:容器的emplace成员函数_第1张图片
注意:emplace函数在容器中直接构造元素,传递给emplace函数的参数必须与元素类型的构造函数匹配。

你可能感兴趣的:(容器的emplace成员函数)