std::vector的emplace_back()

std::vector的emplace_back()

C++11 后向 vector 容器尾部添加元素除了可以使用 push_back() ,还可以使用 emplace_back();

两者的主要区别体现在添加临时对象的效率上。当我们直接将构造函数的参数传递给 emplace_back() 时,emplace_back() 使用这些参数在容器内存中就地构造元素,不用构造一个临时对象后再将其复制到容器中,相比于 push_back() ,省去了一次移动构造与析构的操作,也减少了内存开销。

但是,只有 emplace_back() 中是直接使用构造函数的参数添加临时对象时,emplace_back() 才比 push_back() 有更高的效率,其他情况两者效率一致;

添加临时对象时 push_back() 与 emplace_back() 代码示例如下:

class Date {
public:
    Date() = default;
    Date(const unsigned int year, const unsigned int month, const unsigned int day) : 
        m_year(year), m_month(month), m_day(day) {}
private:
    unsigned int m_year;
    unsigned int m_month;
    unsigned int m_day;
};

int main()
{
    std::vector<Date> vecDate;
    vecDate.reserve(4);
    vecDate.push_back(Date(2021, 12, 7));
    vecDate.emplace_back(2021, 12, 8);
    
    return 0;
}

下图展示了上述代码中添加临时对象时两种方法的区别:

emplace_back

因此当向容器中添加临时对象时,可以多使用 emplace_back() 代替 push_back();


本文作者: 王同学