我想知道是否可以在将单个元素插入STL容器(例如set,unordered_set)中时始终使用emplace替换insert吗?

从签名来看,emplace更简单,并且不涉及重载。停止使用insert和一直使用emplace是否有任何问题?

注意:这里有一些问题,询问emplaceinsert/push_back等之间的区别。(例如hereherehere),我理解其中的区别,在我看来emplace在各方面都更好。我只想确认是否可以弃用insert

最佳答案

有一些示例here可以适应emplaceinsert,显示了何时行为可能有所不同。

这些示例可能看起来有些虚假,因此我将给出一个希望看起来不会那么多的示例:

#include <set>

template <typename T>
T id(T x) { return x; }

int main() {
    std::set<int(*)(int)> s;
    s.insert(id);       // OK
    s.emplace(id);      // error
    s.emplace(id<int>); // OK
}
insert可以推断出id的模板参数,因为它知道所需的类型。除非您明确指定,否则对于emplace您会收到错误消息。

10-08 13:10