map的insert和emplace比较

一、相同点

emplace是C++11新标准引入了新成员,同时引入的 还有emplace_front、emplace_back。分别对应容器的原有操作insert、push_front、push_back。
其功能分别为:将元素插入到一个指定的位置、将元素插入到容器头部、将元素插入到容器尾部。

二、不同点

  • 调用push或者insert时,将元素类型的对象传递出去,这些对象被拷贝到容器当中,或者创建一个局部临时对象,并将其压入容器
  • 调用emplace时,则是将参数传递给元素类型的构造函数,emplace成员使用这些参数在容器管理的内存空间中直接构造元素,没有拷贝操作

三、效率

  • 在大部分情况下,emplace函数可以在集合内直接创建新元素,而不需要将现有元素复制或移动到集合内,使用emplace函数能够减少复制或移动构造函数的开销,能提供比insert、push等函数更高的性能
  • 但对于std::map和std::unordered_map而言,在某些情况下insert可能比emplace更快
    例如:

调用std::map<TKey, TValue>::insert函数需要传入一个std::pair<TKey,TValue>对象。在实际插入时,这个pair会用于复制构造或移动构造map中实际的存储对象,这样会产生一次复制操作。调用std::map<TKey,TValue>::emplace函数时,则会使用传入的参数直接在实际的存储位置原地构造一个std::pair<TKey, TValue>,这样通常可以减少一次复制操作
但是,若key原本就已经存在,则insert只需完成键的对比就可以直接返回了,而emplace将必须原地构造一个新的对象才能开始对比,使用emplace将需要额外的构造开销。

总结

大部分情况下,insert的效率不如emplace,但若key已存在情况下,insert效率优于emplace

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
emplace是C++ STL中map容器的一个成员函数,用于在map容器中插入键值对。emplace函数的作用是在指定位置构造键值对并插入到map容器中。与insert函数不同的是,emplace函数可以直接在map容器的指定位置构造键值对,而不需要创建临时对象。 具体使用方法如下: - 通过emplace函数插入键值对并返回一个迭代器,指向新插入的元素。 - emplace_hint函数与emplace函数功能相似,不同之处在于它接受一个迭代器参数,用于提示插入位置。 引用提供了一个例子,展示了使用emplace_hint函数来插入键值对的过程。在该例子中,使用emplace_hint函数在map容器中插入了三个键值对。另外,引用中的例子展示了使用emplace函数插入键值对的过程。 总结起来,mapemplace函数可以直接在指定位置构造键值对并插入到map容器中,而不需要创建临时对象,从而提高了效率。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [C++ STL map emplace()和emplace_hint()(深入了解,一文学会)](https://blog.csdn.net/qq_37529913/article/details/118771777)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值