在引入右值引用,转移构造函数,转移复制运算符之前,通常使用push_back()向容器中加入一个右值元素(临时对象)的时候,首先会调用构造函数构造这个临时对象,然后需要调用拷贝构造函数将这个临时对象放入容器中。原来的临时变量释放。这样造成的问题是临时变量申请的资源就浪费。
引入了右值引用,转移构造函数(请看这里)后,push_back()右值时就会调用构造函数和转移构造函数。
在这上面有进一步优化的空间就是使用emplace_back

emplace_back

函数原型:

template <class... Args>void emplace_back (Args&&... args);

在容器尾部添加一个元素,这个元素原地构造,不需要触发拷贝构造和转移构造。而且调用形式更加简洁,直接根据参数初始化临时对象的成员。
给出一个示例,这个示例很有用。

#include <vector>
#include <string>
#include <iostream>  struct President
{  std::string name;  std::string country;  int year;  President(std::string p_name, std::string p_country, int p_year)  : name(std::move(p_name)), country(std::move(p_country)), year(p_year)  {  std::cout << "I am being constructed.\n";  }President(const President& other): name(std::move(other.name)), country(std::move(other.country)), year(other.year){std::cout << "I am being copy constructed.\n";}President(President&& other)  : name(std::move(other.name)), country(std::move(other.country)), year(other.year)  {  std::cout << "I am being moved.\n";  }  President& operator=(const President& other);
};  int main()
{  std::vector<President> elections;  std::cout << "emplace_back:\n";  elections.emplace_back("Nelson Mandela", "South Africa", 1994); //没有类的创建  std::vector<President> reElections;  std::cout << "\npush_back:\n";  reElections.push_back(President("Franklin Delano Roosevelt", "the USA", 1936));  std::cout << "\nContents:\n";  for (President const& president: elections) {  std::cout << president.name << " was elected president of "  << president.country << " in " << president.year << ".\n";  }  for (President const& president: reElections) {  std::cout << president.name << " was re-elected president of "  << president.country << " in " << president.year << ".\n";  }}

输出

emplace_back:
I am being constructed.push_back:
I am being constructed.
I am being moved.Contents:
Nelson Mandela was elected president of South Africa in 1994.

emplace_back() 和 push_back 的区别相关推荐

  1. emplace_back和push_back的区别

    相同点:两者都是向容器内添加数据 不同点:当数据为类的对象时,emplace_back相对push_back可以避免额外的移动和复制操作. 以下代码copy from点击打开链接 #include & ...

  2. emplace_back与push_back的区别

    下面举了几种比较常见的情况:(以下所有代码均假设存在一个Teacher类) 1. #include <vector>int main(){ std::vector<Teacher&g ...

  3. C++ - emplace_back 和 push_back 的区别

    https://blog.csdn.net/caroline_wendy/article/details/12967193 https://blog.csdn.net/p942005405/artic ...

  4. emplace_back与push_back异同

    vector的emplace_back与push_back 文章目录 vector的emplace_back与push_back 前言 1.区别总览 2.push_back 支持右值引用 不支持传入多 ...

  5. C++11使用emplace_back代替push_back

    最近在写一段代码的时候,突然很好奇C++11中对push_back有没有什么改进以增加效率,上网搜了一些资料,发现果然新增了emplace_back方法,比push_back的效率要高很多. 首先,写 ...

  6. emplace_back和push_back对比分析

    emplace_back含义 emplace_back是C++11新引进的接口函数. emplace_back是就地构造,不用构造后再次复制到容器中.因此效率更高. push_back 简单的一个案例 ...

  7. C++11:右值引用、移动构造、std::move, 以及使用emplace_back代替push_back

    最近在写一段代码的时候,突然很好奇C++11中对push_back有没有什么改进以增加效率,上网搜了一些资料,发现果然新增了emplace_back方法,比push_back的效率要高很多. 1.右值 ...

  8. c++11中emplace_back vs push_back

    引言 在C11中,有两种方法可以把元素放入容器中:emplace_back和push_back. push_back是C11之前就有的,而emplace_back是C11中新加的. 既然它们的作用都是 ...

  9. C++11:右值引用、move, 以及使用emplace_back代替push_back

    最近在写一段代码的时候,突然很好奇C++11中对push_back有没有什么改进以增加效率,上网搜了一些资料,发现果然新增了emplace_back方法,比push_back的效率要高很多. 1.右值 ...

最新文章

  1. 外包三年,我废了..…
  2. 法尔康,你大爷的,phalcon配置大全
  3. 实用make最佳实践
  4. 免费计算机维修基础教程,《计算机组装与维修基础教程》第1课:计算机基础知识.ppt...
  5. java制作oracle程序,Java程序操作Oracle两种方式之简单实现
  6. Lukas-Kanade光流法
  7. C#算法设计排序篇之11-二叉树排序(附带动画演示程序)
  8. 实用的 BOM 属性对象方法
  9. magento 优化 php.ini,PHP.ini配置文件(中文) | Magento UI
  10. 关于云数据库的“担忧”,你占了几条?
  11. 计算机二级考试c语言 上机,计算机等级考试二级C语言上机题[2]
  12. 安装程序使用计算机做准备,IBM 3850 X5 win2008R2停留在“安装程序正在为首次使用计算机做准备”画...
  13. 国产分布式ETL调度管理工具 TASKCTL 8.0 核心/代理节点部署
  14. ARM GIC(七)gicv3架构-power控制
  15. python opencv合并图片
  16. 节点精灵免root脚本之直播间秒抢红包雨
  17. 发一些收藏的收费MD5
  18. 月经周期28天健康日历表
  19. C语言考试判断题-PTA
  20. 【题库】上海学校心理咨询-普通心理学-考点解析 6.1 表象

热门文章

  1. Day105 项目实战7 商品查询
  2. JavaScript限时秒杀
  3. 2021中国数字经济发展白皮书 附下载
  4. ci mysql操作_MySQL基础篇/第3篇:MySQL基本操作语句.md · icanci/MySQL-Review - Gitee.com...
  5. SSM+Java体育用品库存管理系统 毕业设计-附源码211712
  6. 【C++】搜索二叉树
  7. Access to XMLHttpRequest at ‘http://localhost:8082/sockjs-node/info?t=1610442684722‘ from origin ‘ht
  8. git使用,挖个坑站住先
  9. 仿造问卷星--开发一套调查问卷设计工具(3/3)--完整流程
  10. html 表情符号选择,实用输入域表情符号选择器jQuery插件