📜  C++ STL中的vector :: emplace_back(1)

📅  最后修改于: 2023-12-03 14:39:52.814000             🧑  作者: Mango

C++ STL中的vector::emplace_back

在C++标准模板库(STL)中,vector是一个非常有用的数据结构,它可以动态地增长或缩小数组大小,使得我们可以在需要的时候对数组进行操作。emplace_back是vector类中的一个成员函数,它的作用是在vector的末尾插入一个元素,而不是在vector的末尾附加一个元素。

语法
template< class... Args >
void emplace_back( Args&&... args );
参数

Args:要插入的元素的类型和其构造函数所需的参数。

返回值

功能

将args构造的对象直接插入到vector的结尾位置,无需进行额外的拷贝构造或移动构造。如果args是临时对象,则vector将在单个操作中构造并插入该对象。

示例

下面是一个使用emplace_back的简单示例:

#include <iostream>
#include <vector>

int main()
{
    std::vector<std::pair<int, std::string>> vec;
    vec.emplace_back(1, "one");
    vec.emplace_back(2, "two");
    vec.emplace_back(3, "three");

    for (auto& i : vec)
        std::cout << i.first << " " << i.second << std::endl;

    return 0;
}

输出:

1 one
2 two
3 three

在上面的例子中,我们使用std::pair<int, std::string>作为元素类型,使用emplace_back在vector结尾插入多个元素。第一个参数是int类型,第二个参数是std::string类型。

由于emplace_back不执行额外的拷贝构造或移动构造,因此它比push_back更快。由于它将构造函数参数传递给插入的对象,因此不允许传递到插入的对象的const引用。

注意事项
  1. args允许右值引用。

  2. 可以使用emplace_back来替换push_back,从而减少不必要的构造和析构开销。

  3. 如果要插入的元素需要复制操作,最好使用push_back,因为emplace_back并不能保证它会节省这些操作。

  4. 在使用emplace_back的时候,需要注意元素类型是否拥有默认或移动构造函数。

总结

emplace_back允许我们直接在vector的末尾插入构造函数参数,避免了不必要的拷贝和构造开销,尤其是对于构造函数代价高昂的自定义类型。所以,在使用vector时可以优先考虑使用emplace_back。