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

总结

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

你可能感兴趣的:(c++,编辑器)