c++ emplace_back()和push_back()的区别

36 篇文章 2 订阅
订阅专栏
8 篇文章 0 订阅
订阅专栏

emplace_back() 和 push_back() 的区别,就在于底层实现的机制不同。push_back() 向容器尾部添加元素时,首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中(如果是拷贝的话,事后会自行销毁先前创建的这个元素);而 emplace_back() 在实现时,则是直接在容器尾部创建这个元素,省去了拷贝或移动元素的过程

#include <vector> 
#include <iostream> 
using namespace std;
class testDemo
{
public:
    testDemo(int num):num(num){
        std::cout << "调用构造函数" << endl;
    }
    testDemo(const testDemo& other) :num(other.num) {
        std::cout << "调用拷贝构造函数" << endl;
    }
    testDemo(testDemo&& other) :num(other.num) {
        std::cout << "调用移动构造函数" << endl;
    }
private:
    int num;
};

int main()
{
    cout << "emplace_back:" << endl;
    std::vector<testDemo> demo1;
    demo1.emplace_back(2);  //可以被认为是一个右值

    cout << "push_back:" << endl;
    std::vector<testDemo> demo2;
    demo2.push_back(2);
}
{"mode":"full","isActive":false}

运行结果:

emplace_back:
调用构造函数
push_back:
调用构造函数
调用移动构造函数

总结:

1. push_back 可以接收左值也可以接受右值,接收左值时使用拷贝构造,接收右值时使用移动构造
2. emplace_back 接收右值时调用类的移动构造
3. emplace_back 接收左值时,实际上的执行效果是先对传入的参数进行拷贝构造,然后使用拷贝构造后的副本,也就是说,emplace_back在接收一个左值的时候其效果和push_back一致!所以在使用emplace_back 时需要确保传入的参数是一个右值引用,如果不是,请使用std::move()进行转换
4. emplace_back 接收多个参数时,可以调用匹配的构造函数实现在容器内的原地构造。

最后放一张相关内容的图片:

c++emplace_back()与push_back()区别
weixin_42579072的博客
05-19 2548
在引入右值引用,转移构造函数,转移复制运算符之前,通常使用push_back()向容器中加入一个右值元素(临时对象)的时候,首先会调用构造函数构造这个临时对象,然后需要调用拷贝构造函数将这个临时对象放入容器中。原来的临时变量释放。这样造成的问题是临时变量申请的资源就浪费。 引入了右值引用,转移构造函数(请看这里)后,push_back()右值时就会调用构造函数和转移构造函数。 在这上面有进一步优化的空间就是使用emplace_back 但是emplace_back()函数向容器中中加入临时对象, 临时对象原
C++ emplace_back 与 push_back
m0_73935863的博客
03-03 1571
C++ emplace_back 与 push_back
C++ : emplace_back 与 push_back的区别
woodgril的博客
05-03 445
https://blog.csdn.net/p942005405/article/details/84764104
emplace_back与push_back
最新发布
LIUMINGHUA111的博客
08-10 266
push_back:需要先创建对象,然后将其复制或移动到容器中。:直接在容器中构造对象,避免了额外的复制或移动,通常更高效。在需要频繁添加对象时,使用可以提高性能。对于,使用push_back和的性能差异可以忽略不计。选择使用哪一个通常取决于代码的可读性和一致性。在处理基本数据类型时,您可以根据个人或团队的编码风格来选择。对于,使用通常比push_back更高效,特别是在处理复杂对象时。建议,在需要频繁添加字符串的情况下,使用,以提高性能。使用push_back。
[c++] push_back和emplace_back的区别
GreenTeemo的博客
09-07 859
介绍 emplace操作是C++11新特性,新引入的三个操作emplace_front、emplaceemplace_back,分别对应push_front、insert 和push_back,允许我们将元素放在容器头部、一个指定的位置和容器尾部[1]。 本文以emplace_back和push_back为例讲解两者的区别区别 调用push_back时,参数为元素类型的对象,这个对象被拷贝到容器中。 调用emplace_back时,参数与该元素类型构造函数的参数相同,会在容器管理的内存空间内直接
C++ push_back和 emplace_back的区别
ld_long的博客
01-23 237
push_back和emplace_back的区别
C++push_back()和emplace_back()区别
qq_41605662的博客
11-23 1473
C++push_back()和emplace_back()区别
c++ emplace_back与push_back
01-08
容器的emplace_back与push_back方法 emplace_back针对添加的元素为 “某个对象struct、class” ,可以直接写参数,函数自动调用构造函数,而不用先创建对象再添加。 push_back需要先创建对象,再添加。 emplace、...
C++ 中”emplace_back” 与 “push_back” 的区别
01-01
C++ 中”emplace_back” 与 “push_back” 的区别 emplace_back和push_back都是向容器内添加数据. 对于在容器中添加类的对象时, 相比于push_back,emplace_back可以避免额外类的复制和移动操作. “emplace_back ...
C++ 中"emplace_back" 与 "push_back" 的区别
08-30
C++编程中,`emplace_back`和`push_back`都是用于向动态数组容器(如`std::vector`)的末尾添加元素的方法,但它们在处理元素构造和插入过程上有所不同,这直接影响到效率和内存管理。理解这些差异对于优化代码...
emplace_back和push_back对比分析
m0_70418130的博客
07-27 1079
emplace_back是C++11新引进的接口函数。emplace_back是就地构造,不用构造后再次复制到容器中。因此效率更高。
c++11 之emplace_back 与 push_back的区别
热门推荐
学之知之的博客
12-03 16万+
c++开发中我们会经常用到插入操作对stl的各种容器进行操作,比如vector,map,set等。在引入右值引用,转移构造函数,转移复制运算符之前,通常使用push_back()向容器中加入一个右值元素(临时对象)时,首先会调用构造函数构造这个临时对象,然后需要调用拷贝构造函数将这个临时对象放入容器中。原来的临时变量释放。这样造成的问题就是临时变量申请资源的浪费。 引入了右值引用,转移构造函数后...
C++emplace_back和push_back区别
居老师的博客
04-29 905
emplace_back()是c++11的新特性。 区别在于: push_back()方法要调用构造函数和复制构造函数,这也就代表着要先构造一个临时对象,然后把临时的copy构造函数拷贝或者移动到容器最后面。 而emplace_back()在实现时,则是直接在容器的尾部创建这个元素,省去了拷贝或移动元素的过程。 结论:在C++11情况下,果断用emplace_back代替push_back ...
c++emplace_back()与push_back()的区别,STL,vector,list,map
qq_35102059的博客
10-13 1379
emplace_back() 和 push_back() 的区别,就在于底层实现的机制不同。 push_back() 向容器尾部添加元素时,首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中(如果是拷贝的话,事后会自行销毁先前创建的这个元素)。使用到了拷贝构造函数。 而 emplace_back() 在实现时,则是直接在容器尾部创建这个元素,省去了拷贝或移动元素的过程。直接使用构造参数列表来添加元素的方法,它会使用到了移动构造函数 move(不用拷贝一个复制品)。 源码实现的区别: _A
C++ STL vector添加元素(push_back()和emplace_back())详解
天涯路的专栏
08-06 2692
转载:http://c.biancheng.net/view/6826.html 要知道,向 vector 容器中添加元素的唯一方式就是使用它的成员函数,如果不调用成员函数,非成员函数既不能添加也不能删除元素。这意味着,vector 容器对象必须通过它所允许的函数去访问,迭代器显然不行。 在 《STL vector容器详解》一节中,已经给大家列出了 vector 容器提供的所有成员函数,在这些成员函数中,可以用来给容器中添加元素的函数有 2 个,分别是 push_back() 和 emplace_back
C++push_back和emplace_back的区别(代码+踩坑记录
weixin_51639169的博客
03-13 589
C++11 emplace back 和 push back 的区别
C++ emplace_back 和 push_back 的区别
redenval的专栏
01-10 4035
emplace_back和push_back都是向容器内添加数据. 对于在容器中添加类的对象时, 相比于push_back,emplace_back可以避免额外类的复制和移动操作. "emplace_back avoids the extra copy or move operation required when using push_back." 为了证实
C++emplace_back()和push_back()的区别
qq_41897304的博客
07-19 211
vector中可以用来从容器末尾添加元素的函数有 2 个,分别是 push_back() 和 emplace_back() 函数。1 2emplace_back()函数是 C++ 11 新增加的,其功能和 push_back() 相同,都是在 vector 容器的尾部添加一个元素。1 2emplace_back() 和 push_back() 的区别,就在于底层实现的机制不同。。
emplace_back()和push_back()的区别
11-24 1万+
emplace_back()和push_back()的区别 emplace_back() 和 push_back() 的区别,就在于底层实现的机制不同。push_back() 向容器尾部添加元素时,首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中(如果是拷贝的话,事后会自行销毁先前创建的这个元素);而 emplace_back() 在实现时,则是直接在容器尾部创建这个元素,省去了拷贝或移动元素的过程。 ...
c++容器中emplace_back和push_back的区别
04-28
C++容器中,`emplace_back`和`push_back`都是向容器尾部添加元素的方法,但它们有一些区别。 `push_back`方法接受一个已构造的对象,并将其拷贝或移动到容器中。这意味着在调用`push_back`时,需要先创建一个对象...
写文章

热门文章

  • C++ 几个入门程序 41652
  • C语言—子函数的练习 11923
  • 配置Hadoop实验环境 运行jps后未显示datanode或者namenode 7247
  • 操作系统之信号量机制以及使用信号量实现进程(线程)同步和互斥 3362
  • 操作系统虚拟内存和地址映射 2557

分类专栏

  • 报错 1篇
  • c++ 36篇
  • 计算机网络 3篇
  • 秋招笔试 5篇
  • 笔记 1篇
  • 一些技巧 8篇
  • 操作系统 4篇
  • 力扣 10篇
  • latex 1篇
  • sql 1篇
  • 双系统安装 1篇

最新评论

  • 米哈游笔试(9/12)

    不想讀研的研究僧: 应该是开发岗,现在已凉

  • 米哈游笔试(9/12)

    花川镜雅: 请问投的什么岗呀

  • 网易软开(8.21)笔试记录

    不想讀研的研究僧: 是字符串的第k个字符吧

  • 网易软开(8.21)笔试记录

    杠杠的丶: 我忘了返回的是什么了,是第n个字母吗

  • 网易软开(8.21)笔试记录

    不想讀研的研究僧: 已经忘了表情包,可以找找别人写的 当时没在本地写

大家在看

  • Uni-App基于微信小程序的公共浴池洗澡按摩系统
  • 题目描述 :输入三个正整数,判断用这三个整数做边长是否能构成一个直角三角形。
  • C语言进阶专栏:结构体专题(下) 190
  • 【数据结构与算法】串,数组和队列 533

最新文章

  • slf4jSLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“.SLF4J: Defaulting to no-operat
  • 米哈游笔试(9/12)
  • delete和delete[]的区别
2022年1篇
2021年49篇
2020年8篇
2019年1篇
2018年6篇

目录

目录

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

玻璃钢生产厂家玻璃钢雕塑定做厂家哪里有淮北公园玻璃钢雕塑优势美陈对于商场泰州玻璃钢仿真水果雕塑厂家北京大型主题商场美陈费用江苏大型商场美陈现价玻璃钢公园雕塑现货供应三国卡通玻璃钢雕塑焦作附近玻璃钢卡通雕塑价格韶关商场美陈玻璃钢雕塑不耐用南京商场美陈销售企业濮阳玻璃钢不锈钢镂空雕塑成都玻璃钢人物雕塑价格扶沟玻璃钢雕塑价格无锡新年商场美陈仿玉玻璃钢雕塑盐池玻璃钢雕塑加工五指山大型玻璃钢人物雕塑厂家玻璃钢树脂乐高雕塑玻璃钢仿真动植物雕塑泰安佛像玻璃钢雕塑福建人物玻璃钢雕塑价位玻璃钢景观雕塑免费咨询青海城市玻璃钢雕塑设计苏州商场入口美陈重庆佛像玻璃钢雕塑订做价格玻璃钢基督教雕塑安装太原玻璃钢仿铜雕塑定制伊春玻璃钢牌匾雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化