在使用vector容器时,往容器里添加元素时,有push_back和emplace_back两种方法,一般用得最多得是push_back,下面看看这两种方法得区别:

push_back源码,有重载得左值和右值,关于左值和右值可以查看右值引用、移动构造函数和move

void push_back(value_type&& _Val)
{   // insert by moving into element at endif (_Inside(_STD addressof(_Val))){  // push back an elementsize_type _Idx = _STD addressof(_Val) - _Unfancy(this->_Myfirst());if (this->_Mylast() == this->_Myend())_Reserve(1);_Orphan_range(this->_Mylast(), this->_Mylast());this->_Getal().construct(_Unfancy(this->_Mylast()),_STD forward<value_type>(this->_Myfirst()[_Idx]));++this->_Mylast();}else{ // push back a non-elementif (this->_Mylast() == this->_Myend())_Reserve(1);_Orphan_range(this->_Mylast(), this->_Mylast());this->_Getal().construct(_Unfancy(this->_Mylast()),_STD forward<value_type>(_Val));++this->_Mylast();}
}void push_back(const value_type& _Val)
{   // insert element at endif (_Inside(_STD addressof(_Val))){ // push back an elementsize_type _Idx = _STD addressof(_Val) - _Unfancy(this->_Myfirst());if (this->_Mylast() == this->_Myend())_Reserve(1);_Orphan_range(this->_Mylast(), this->_Mylast());this->_Getal().construct(_Unfancy(this->_Mylast()),this->_Myfirst()[_Idx]);++this->_Mylast();}else{ // push back a non-elementif (this->_Mylast() == this->_Myend())_Reserve(1);_Orphan_range(this->_Mylast(), this->_Mylast());this->_Getal().construct(_Unfancy(this->_Mylast()),_Val);++this->_Mylast();}
}

emplace_back源码:

template<class... _Valty>
void emplace_back(_Valty&&... _Val)
{   // insert by moving into element at endif (this->_Mylast() == this->_Myend())_Reserve(1);_Orphan_range(this->_Mylast(), this->_Mylast());this->_Getal().construct(_Unfancy(this->_Mylast()),_STD forward<_Valty>(_Val)...);++this->_Mylast();
}

从源代码中可以看出,两者只有参数得区别,push_back参数为左值引用和右值引用,而emplace_back是一个参数包_Valty&&…,你可以向这个参数包传构造对象得参数即可。

实例分析:

class A
{public:int i;A(int t) :i(t) { cout << "A()" << endl; }A(const A&a) :i(a.i) { cout << "拷贝构造" << endl; }A( A&&a) :i(a.i) { cout << "移动构造" << endl; }
};int main()
{A a(1);vector<A> v1;v1.push_back(a);cout << "---------------" << endl;vector<A> v11;v11.push_back(A(2));cout << "---------------" << endl;vector<A> v2;v2.emplace_back(A(3));cout << "---------------" << endl;vector<A> v22;A aa(1);v22.emplace_back(aa);cout << "---------------" << endl;vector<A> v3;v3.emplace_back(11);return 0;
}


从结果中可以看出,如果直接传对象给push_back和emplace_back,无论是实名对象还是匿名对象,结果都是一样的,但是emplance_back不同的是你可以直接传构造对象的参数,然后emplace_back函数里通过参数来直接构造对象,从而少了一次构造,效率更高。

push_back和emplace_back区别相关推荐

  1. C++11介绍之vector::push_back和vector::emplace_back区别

    vector::push_back和vector::emplace_back区别 emplace_back() 和 push_back() 功能上类似,但底层实现机制是不同的.push_back() ...

  2. push_back()和emplace_back()函数

    参考原文:http://c.biancheng.net/view/6826.html 要知道,向 vector 容器中添加元素的唯一方式就是使用它的成员函数,如果不调用成员函数,非成员函数既不能添加也 ...

  3. push_back、emplace_back、std::move

    1.push_back和emplace_back的区别 emplace_back() 和 push_back() 的区别: 就在于底层实现的机制不同.push_back() 向容器尾部添加元素时,首先 ...

  4. C++:vector的push_back()与emplace_back()

    在STL中,向vector容器添加元素的函数有2个:push_back().emplace_back() 1.push_back() 在vector容器尾部添加一个元素,用法为: arr.push_b ...

  5. C++小实验之vector的 push_back 和 emplace_back 及其使用时机

    参考 参考一: 如果参数是左值,两个调用的都是copy constructor 如果参数是右值,两个调用的都是move constructor(C++ 11后push_back也支持右值) 最主要的区 ...

  6. push_back 和 emplace_back 剖析

    文章目录 前言 一.源码 二.共同点 三.优化点 总结 前言 仓库推荐 C/C++ 每日一练小仓库,慢慢学习C++ 知识必备仓库 https://github.com/yeshenyong/pract ...

  7. push_back()和emplace_back()详解

    学习链接:C++ STL vector添加元素(push_back()和emplace_back())详解 1. emplace_back C++11新增:与push_back功能相同,在vector ...

  8. vector中push_back()和emplace_back()的区别

    emplace_back() 和 push_back() 的区别,就在于底层实现的机制不同. push_back() 向容器尾部添加元素时,首先会创建这个元素,然后再将这个元素拷贝(调用拷贝构造函数) ...

  9. push_back和emplace_back的区别

    在引入右值引用,转移构造函数,转移复制运算符之前,通常使用push_back()向容器中加入一个右值元素(临时对象)的时候,首先会调用构造函数构造这个临时对象,然后需要调用拷贝构造函数将这个临时对象放 ...

  10. push_back还是emplace_back?

    背景和区别 emplace_back() 是 C++11 之后,vector容器中添加的新方法,和 push_back()一样,都是在容器末尾添加一个新的元素,相对于push_back函数,它减少了一 ...

最新文章

  1. JavaScript实现 按钮不可过频繁使用
  2. 2019第十届蓝桥杯C/C++ A组省赛 —— 第三题: 最大降雨量
  3. 物联网项目:将Arduino连接到Ubidots和Android –第1部分
  4. 训练日志 2019.7.23
  5. nmap中文使用手册
  6. 54 计算机与信息科学类,计算机与信息科学类专业包括哪些
  7. kube-proxy修改成ipvs模式
  8. 贺利坚老师汇编课程29笔记:在代码段使用栈将程序定义的数据逆序
  9. IntelliJ IDEA中激活JRebel插件
  10. Redis 分布式客户端 Redisson 分布式锁快速入门
  11. ISO三体系认证辅导,ISO三体系验厂提升企业内部管理水平、降低企业各种风险
  12. 使用大白鲨进行木马攻击实验并实现爆破目标机账号密码以远程连接
  13. android 汉字笔画拆写,汉字笔画顺序之重新开启
  14. matlab函数 kron
  15. GreenPlum分区表原理
  16. 阻抗测量单芯片方案AD5933 芯片使用方法
  17. hosts文件的作用
  18. 5个最好的WordPress电子商务插件比较 - 2018年
  19. 数码管段码代码查询工具
  20. 基于用户点击偏好和阅读满意度的个性化新闻推荐技术

热门文章

  1. SaaS 公司融资的「22条军规」
  2. 廊坊金彩教育:怎么做好人群标签
  3. java实现普通图片转黑白图片
  4. Centos校准时间
  5. 教师计算机研修培训日志感言,2019年教师研修感言
  6. 如何从本地硬盘启动计算机,解密:如何在计算机BIOS中设置硬盘启动
  7. Hikari数据库连接池泄露问题排查
  8. 微信小程序:图片秒加水印制作生成
  9. U-Mail邮件系统管理功能 高效办公轻松搞定
  10. 判断距离1970年1月1日的天数