018 使用 emplace 操作

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

你可能感兴趣的:(018 使用 emplace 操作)