c – 基本类型的安置值得吗?

前端之家收集整理的这篇文章主要介绍了c – 基本类型的安置值得吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
假设我有一张地图< 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>再次成为第一对的成员.

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

解决方法

如果有可能失败(密钥已经存在),则Emplace速度较慢.

这是因为需要安装以分配节点并构造对< 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变体,代码大小仍然会略大,因为它必须准备好在故障情况下执行更多工作.

猜你在找的C&C++相关文章