emplace_back() 和 push_back 的区别
在引入右值引用,转移构造函数,转移复制运算符之前,通常使用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 的区别相关推荐
- emplace_back和push_back的区别
相同点:两者都是向容器内添加数据 不同点:当数据为类的对象时,emplace_back相对push_back可以避免额外的移动和复制操作. 以下代码copy from点击打开链接 #include & ...
- emplace_back与push_back的区别
下面举了几种比较常见的情况:(以下所有代码均假设存在一个Teacher类) 1. #include <vector>int main(){ std::vector<Teacher&g ...
- C++ - emplace_back 和 push_back 的区别
https://blog.csdn.net/caroline_wendy/article/details/12967193 https://blog.csdn.net/p942005405/artic ...
- emplace_back与push_back异同
vector的emplace_back与push_back 文章目录 vector的emplace_back与push_back 前言 1.区别总览 2.push_back 支持右值引用 不支持传入多 ...
- C++11使用emplace_back代替push_back
最近在写一段代码的时候,突然很好奇C++11中对push_back有没有什么改进以增加效率,上网搜了一些资料,发现果然新增了emplace_back方法,比push_back的效率要高很多. 首先,写 ...
- emplace_back和push_back对比分析
emplace_back含义 emplace_back是C++11新引进的接口函数. emplace_back是就地构造,不用构造后再次复制到容器中.因此效率更高. push_back 简单的一个案例 ...
- C++11:右值引用、移动构造、std::move, 以及使用emplace_back代替push_back
最近在写一段代码的时候,突然很好奇C++11中对push_back有没有什么改进以增加效率,上网搜了一些资料,发现果然新增了emplace_back方法,比push_back的效率要高很多. 1.右值 ...
- c++11中emplace_back vs push_back
引言 在C11中,有两种方法可以把元素放入容器中:emplace_back和push_back. push_back是C11之前就有的,而emplace_back是C11中新加的. 既然它们的作用都是 ...
- C++11:右值引用、move, 以及使用emplace_back代替push_back
最近在写一段代码的时候,突然很好奇C++11中对push_back有没有什么改进以增加效率,上网搜了一些资料,发现果然新增了emplace_back方法,比push_back的效率要高很多. 1.右值 ...
最新文章
- 外包三年,我废了..…
- 法尔康,你大爷的,phalcon配置大全
- 实用make最佳实践
- 免费计算机维修基础教程,《计算机组装与维修基础教程》第1课:计算机基础知识.ppt...
- java制作oracle程序,Java程序操作Oracle两种方式之简单实现
- Lukas-Kanade光流法
- C#算法设计排序篇之11-二叉树排序(附带动画演示程序)
- 实用的 BOM 属性对象方法
- magento 优化 php.ini,PHP.ini配置文件(中文) | Magento UI
- 关于云数据库的“担忧”,你占了几条?
- 计算机二级考试c语言 上机,计算机等级考试二级C语言上机题[2]
- 安装程序使用计算机做准备,IBM 3850 X5 win2008R2停留在“安装程序正在为首次使用计算机做准备”画...
- 国产分布式ETL调度管理工具 TASKCTL 8.0 核心/代理节点部署
- ARM GIC(七)gicv3架构-power控制
- python opencv合并图片
- 节点精灵免root脚本之直播间秒抢红包雨
- 发一些收藏的收费MD5
- 月经周期28天健康日历表
- C语言考试判断题-PTA
- 【题库】上海学校心理咨询-普通心理学-考点解析 6.1 表象
热门文章
- Day105 项目实战7 商品查询
- JavaScript限时秒杀
- 2021中国数字经济发展白皮书 附下载
- ci mysql操作_MySQL基础篇/第3篇:MySQL基本操作语句.md · icanci/MySQL-Review - Gitee.com...
- SSM+Java体育用品库存管理系统 毕业设计-附源码211712
- 【C++】搜索二叉树
- Access to XMLHttpRequest at ‘http://localhost:8082/sockjs-node/info?t=1610442684722‘ from origin ‘ht
- git使用,挖个坑站住先
- 仿造问卷星--开发一套调查问卷设计工具(3/3)--完整流程
- html 表情符号选择,实用输入域表情符号选择器jQuery插件