std::vector的emplace_back()
2022-01-10
2 min read
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() 代替 push_back();
版权声明:
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!