新的C++11模板方法是否会使以前的C++98/03 push_back/insert方法过时

Do the new C++11 emplace methods make the previous C++98/03 push_back/insert methods obsolete?

本文关键字:push back 过时 方法 insert C++98 是否 模板方法 C++11 新的      更新时间:2023-10-16

在C++11中使用vector::push_back()而不是vector::emplace_back(),类似地使用map::insert()而不是map::emplace()是否仍然有意义?

我的理解是,新的现代C++11模板方法用给定的参数(完全转发给构造函数)在适当的位置构造对象,因此它们保存复制和移动操作,因此它们应该比旧的C++98/03方法更高效。

我是不是错过了什么?

劝阻使用旧式方法安全吗?

从push_back()和template_back(。

void push_back( const T& value );
void push_back( T&& value );

template< class... Args >
void emplace_back( Args&&... args );

代码样本

vector<int> v;
v.push_back(1); // "Constructs" an int object in place, then passes it by reference or refref
v.emplace_back(1); // Calls int constructor with argument 1 directly in place in vector

vector<SpaceShip> u;
u.push_back(SpaceShip(new Engine(), new Hull())); // Make a temporary, then COPY or MOVE
u.emplace_back(new Engine(), new Hull()); // Construct in place

正如您所说,emplace_back旨在构造对象。那么,如果你已经有了一个对象,并且你想在容器中复制或移动它,该怎么办呢?为什么要调用emplace_back来创建一个新的实例,即使您可以将现有对象移动到这个新实例中?

对于不同的目的,这两种选择都是有用的。emplace_back可能能够以相同的性能与push_back做完全相同的事情,但在代码中显示您的意图仍然更清晰。