首页 > 编程语言 >c++中push_back和emplace_back

c++中push_back和emplace_back

时间:2024-07-18 11:57:20浏览次数:14  
标签:emplace 对象 back 构造 push 构造函数

 

push_back 和 emplace_back 都是用于在容器(如 std::vectorstd::deque 等)的末尾添加元素的方法,但它们在实现细节和性能上有显著区别:

  1. 构造方式:

    • push_back 首先在容器外部构造一个完整的对象,然后将这个对象移动或拷贝到容器的末尾。
    • emplace_back 直接在容器管理的存储空间中构造对象,避免了构造临时对象和随后的移动或拷贝。
  2. 性能影响:

    • emplace_back 通常比 push_back 更高效,尤其是当对象构造成本较高时,因为减少了不必要的构造和拷贝步骤。
  3. 参数传递:

    • push_back 接受一个已经构造好的对象作为参数。
    • emplace_back 接受与对象构造函数匹配的参数列表,这些参数用于直接构造对象。

不能互换的情况

虽然在很多情况下 push_back 和 emplace_back 可以互换使用,但存在一些情况它们不能互换:

  1. 构造函数限制:

    • 如果类的构造函数是私有的或在当前作用域中不可见,emplace_back 将无法使用,因为需要直接调用构造函数。
    • 如果类型不支持就地构造,或者构造函数不接受可转发的参数,emplace_back 将无法工作。
  2. 拷贝构造需求:

    • 如果你的逻辑依赖于拷贝构造函数的特殊行为,比如资源管理或初始化,你可能需要使用 push_back 来确保拷贝构造函数被调用。
  3. 模板参数推导失败:

    • emplace_back 依赖于模板参数的自动推导,如果编译器无法正确推导,你可能需要使用 push_back
  4. 调试需求:

    • 使用 push_back 时,由于创建了临时对象,你可以在构造函数中添加断点或日志,这在使用 emplace_back 时可能难以实现。
  5. 兼容性问题:

    • 在较老的编译器或环境中,emplace_back 可能不受支持,此时只能使用 push_back

总的来说,emplace_back 提供了更高的效率和更现代的C++编程实践,但在某些特定条件下,你可能需要回退到使用 push_back。在设计类和容器元素时,考虑到 emplace_back 的使用,可以使代码更加高效和灵活。

标签:emplace,对象,back,构造,push,构造函数
From: https://www.cnblogs.com/VincentMan/p/18309224

相关文章

  • idea git 提交代码(commit)代码后,没有未push后怎么撤回
    1.方法一 第二步: HEAD~1--->Reset---> 右键项目--》 或者 接下来----》 提醒-----------------  提醒---------   提醒-------------(重要的话说三遍),如果本地写很多代码逻辑,一定做好备份直接选择远程分支,checkoutandrebase(做好本地新写未提交......
  • springboot使用logback日志出现LOG_PATH_IS_UNDEFINED文件夹的问题
    logback现在基本上已经成为springboot日志框架中使用最多的日志实现,在使用中与各中间件集成的一些注意事项记录如下 一SpringBoot中logback读取application.properties(application.yml)中的属性其中使用的时候发现了一个问题,就是如果使用的lobback配置文件的名称是logb......
  • Lookback Lens:用注意力图检测和减轻llm的幻觉
    在总结文章或回答给定段落的问题时,大语言模型可能会产生幻觉,并会根据给定的上下文回答不准确或未经证实的细节,这也被称为情境幻觉。为了解决这个问题,这篇论文的作者提出了一个简单的幻觉检测模型,其输入特征由上下文的注意力权重与新生成的令牌(每个注意头)的比例给出。它被......
  • WPF Canvas ZoomIn ZoomOut via set Background="Transparent"
    <CanvasGrid.Column="1"Background="Transparent"x:Name="cvs"ClipToBounds="True"MouseWheel="cvs_MouseWheel"MouseDown="cvs_MouseDown"MouseUp="cvs_MouseUp"MouseMove="cvs_......
  • mormot.rest.core--TRestBackgroundTimer
    mormot.rest.core--TRestBackgroundTimer{************自定义REST执行}type///TRestServer.Uri()方法可能执行的所有命令//-execSoaByMethod用于基于方法的服务//-execSoaByInterface用于基于接口的服务//-execOrmGet用于ORM读取操作,即Retrieve......
  • Lookback Lens:用注意力图检测和减轻llm的幻觉
    在总结文章或回答给定段落的问题时,大语言模型可能会产生幻觉,并会根据给定的上下文回答不准确或未经证实的细节,这也被称为情境幻觉。为了解决这个问题,这篇论文的作者提出了一个简单的幻觉检测模型,其输入特征由上下文的注意力权重与新生成的令牌(每个注意头)的比例给出。它被称为回......
  • YOLOv8-Seg改进:backbone主干改进 | 微软新作StarNet:超强轻量级Backbone | CVPR 2024
     ......
  • YOLOv8原创改进:backbone主干改进 | 微软新作StarNet:超强轻量级Backbone | CVPR 2024
     ......
  • Backend - C# 的日志Lognet4
    目录一、安装log4net插件(一)作用(二)操作(三)注意二、配置(一)配置AssemblyInfo.cs (二)配置log4net.config1.创建log4net.config文件(和program.cs同层级)2.设置文件属性3.其中,文件内容:三、使用(一)封装一个类,方便管理(二)调用(三)等级Level四、其他:简单日志(一)定义日志......
  • gitlab钩子,push推送触发服务器自动更新pull
    搬自自己的51cto博客,不想用51cto了我用的linux的宝塔面板代码是php 流程1.创建秘钥linux创建rsa密钥对(创建的是www用户的秘钥)sudo-Huwwwssh-keygen-trsa运行之后会让你填具体路径,可以写/home/www/.ssh/id_rsa.pub还会让你填密码短语,不用填,直接回车还会再让......