C++ 11 引入了三个新成员 —— emplace_front、emplace 和 emplace_back,这些操作构造而不是拷贝元素。这些操作分别对应 push_front、insert 和 push_back,允许我们将元素放置在容器头部、指定位置之前或容器尾部。
当调用 push 或 insert 成员函数时,我们将元素类型的对象传递给它们,这些对象被拷贝到容器中。而我们调用一个 emplace 成员函数时,则是将参数传递给元素类型的构造函数。emplace 成员使用这些参数在容器管理的内存空间中直接构造元素。例如,假定 c 保存 SalesData 元素:
// 在 c 的末尾构造一个 SalesData 对象
// 使用三个参数的 SalesData 构造函数
c.emplace_back("test0", 25, 99.99);
// 错误:没有接受三个参数的 push_back 版本
c.push_back("test0", 25, 99.99);
// 正确:创建一个临时的 SalesData 对象传递给 push_back
c.push_back(SalesData("test0", 25, 99.99));
其中对 emplace_back 的调用和第二个 push_back 调用都会创建新的 SalesData 对象。在调用 emplace_back 时,会在容器管理的内存空间中直接创建对象。而调用 push_back 则会创建一个局部临时对象,并将其压入容器中。
emplace 函数的参数根据元素类型而变化,参数必须与元素类型的构造函数相匹配:
// 在 c 的末尾构造一个 SalesData 对象
// 使用 SalesData 的默认构造函数
c.emplace_back();
// 使用两个参数的 SalesData 构造函数
c.emplace_back(iter, "test0");
// 使用三个参数的 SalesData 构造函数
c.emplace_back("test0", 25, 99.99);