coy*_*508 7 c++ containers c++14
假设我有一个map<int, int>:
std::map<int, int> map;
map.emplace(1, 2);
map.insert({3, 4});
Run Code Online (Sandbox Code Playgroud)
这两个电话会有什么不同吗?
在第一次调用中,两个整数将按值复制到emplace函数,然后再复制到std::pair<int, int>构造函数.在第二次调用中,两个整数将按值复制到std::pair<int, int>构造函数,然后std::pair<int, int> 再作为第一对的成员按值复制到内部.
我理解emplace对于类型的好处,比如std::string它们会在第二次调用中被值复制并在第一次调用中一直移动,但emplace在描述的情况下使用是否有任何好处?
eca*_*mur 11
如果有可能失败(密钥已经存在),则Emplace速度较慢.
这是因为emplace需要分配节点并构造pair<Key const, Value>它,然后从该节点提取密钥并检查密钥是否已经存在,然后如果密钥已经存在则解除分配节点.另一方面,insert可以从要插入的传递值中提取密钥,因此如果插入失败则不需要分配节点.请参阅:emplace的性能比检查后的进度更差.
为了解决这个问题,C++ 17添加了一个成员函数try_emplace(const key_type& k, Args&&... args)(等)
如果成功,这两种情况之间没有真正的区别; 操作顺序不同,但不会以任何可预测的方式影响性能.对于emplace变体,代码大小仍然会略大,因为它必须准备好在故障情况下执行更多工作.