基本类型的安置是值得的吗?

时间:2016-06-02 14:58:20

标签: c++ containers c++14

假设我有map<int, int>

std::map<int, int> map;

map.emplace(1, 2);
map.insert({3, 4});

这两个电话会有什么不同吗?

在第一次调用中,两个整数将按值复制到emplace函数,然后再复制到std::pair<int, int>构造函数。在第二次调用中,两个整数将按值复制到std::pair<int, int>构造函数,然后再按值复制到内部std::pair<int, int>作为第一对的成员。

我理解std::string类型的emplace的好处,它们会在第二个调用中按值复制并在第一个调用中一直移动,但使用emplace有什么好处在描述的情况?

1 个答案:

答案 0 :(得分:11)

如果有可能失败(该钥匙已经存在),则Emplace会变慢。

这是因为emplace需要分配节点并构造pair<Key const, Value>,然后从该节点提取密钥并检查密钥是否已存在,然后取消分配节点钥匙已经存在。另一方面,insert可以从要插入的传递值中提取密钥,因此如果插入失败则不需要分配节点。请参阅:performance of emplace is worse than check followed by emplace

为了解决这个问题,C ++ 17添加了一个成员函数try_emplace(const key_type& k, Args&&... args) (etc.)

如果成功,两种情况之间没有真正的区别;操作顺序不同,但不会以任何可预测的方式影响性能。 emplace变体的代码大小仍会略大,因为它必须准备好在失败的情况下执行更多工作。