文档章节

std::vector::push_back和std::vector::emplace_back的区别

xjh0911
 xjh0911
发布于 2018/11/28 00:22
字数 583
阅读 174
收藏 2
vector<T>().push_back(T(args));

相当于

vector<T>().emplace_back(args);

C++11之前,push_back先后调用了构造函数、拷贝构造函数(临时申请堆空间,影响性能);

C++11之后,push_back先后调用了构造函数、转移构造函数。

在C++11的基础上,emplace_back比push_back少了一次转移构造函数,只有构造函数。

在www.cplusplus.com的std::vector::push_back的注解中,提到参数可能被拷贝或移动(即 左值引用 或 右值引用):

Adds a new element at the end of the vector, after its current last element. The content of val is copied (or moved) to the new element.

这里有个帖子做了性能测试,https://blog.csdn.net/yockie/article/details/52674366

大致代码如下:

std::vector<std::string> v;
int count = 10000000;	//分别for循环调用10000000次
v.reserve(count);       //预分配十万大小,排除掉分配内存的时间

// 方式一:push_back(const string&),参数是左值引用(传统的引用)
{
    // push_back string:327ms【最慢】
    std::string temp("ceshi");          // 一次std::string构造函数
    v.push_back(temp);                  // 左值引用,临时变量的构造函数,拷贝构造
}

// 方式二:push_back(string &&), 参数是右值引用
{
    // push_back move(string):213ms
    std::string temp("ceshi");          // 一次std::string构造函数
    v.push_back(std::move(temp));       // 右值引用,临时变量的构造函数,拷贝构造

    // push_back(string):229 ms 
    v.push_back(std::string("ceshi"));  // 一次std::string构造函数,临时变量的构造函数,右值引用,拷贝构造

    // push_back(c string):215 ms 
    v.push_back("ceshi");               // 比上面两种稍微快一点点,少了一次std::string构造函数
}

// 方式三:emplace_back(c string):122 ms【最块】
{
    v.emplace_back("ceshi");            // 只有一次构造函数,不调用拷贝构造函数,速度最快
}

参考资料:

[解说]:c++ 11中emplace_back替代push_back的相关知识点,含右值引用,move用法等

[测试]:C++11使用emplace_back代替push_back

[解说]:emplace_back() 和 push_back 的区别

[问题]:为何vector的push_back操作与emplace_back差异这么大

[解说]:C++ 11 左值,右值,左值引用,右值引用,std::move, std::foward

[解说]:C++ 左值引用与右值引用

[问答]:vector::push_back(V&& v)用不用右值引用的区别

© 著作权归作者所有

xjh0911
粉丝 2
博文 6
码字总数 1909
作品 0
杭州
程序员
私信 提问
C++11容器中新增加的emplace相关函数的使用

C++11中,针对顺序容器(如vector、deque、list),新标准引入了三个新成员:emplacefront、emplace和emplaceback,这些操作构造而不是拷贝元素。这些操作分别对应pushfront、insert和pushbac...

fengbingchun
2017/11/29
0
0
C++11 提升Vector效能的技巧

(1)提前分配足够的空间以避免不必要的重新分配和复制周期 这个情况在 Scott Meyers 的书中得到了很好的解释,这本书叫 Effective STL-50条有效使用STL的经验: 对于 vector 和 string,在需...

吃一堑消化不良
2016/12/01
49
0
编程杂谈——std::vector与List的性能比较

昨天在比较完C++中std::vector的两个方法的性能差异并留下记录后——编程杂谈——使用emplaceback取代pushback,今日尝试在C#中测试对应功能的性能。 C#中对应std::vector的数据结构为List。...

Ken.W
昨天
0
0
6 个技巧,提升 C++11 的 vector 性能

Vector 就像是 C++ STL 容器的瑞士军刀。Bjarne Stoutsoup 有一句话 – “一般情况下,如果你需要容器,就用 vector”。像我们这样的普通人把这句话当作真理,只需要照样去做。然而,就像其它...

oschina
2016/11/29
11.7K
19
C++——std::Priority_queue

写在前面 这一部分学习一下优先级队列这样一种STL容器。priority queue 优先级队列是一个拥有权值概念的单向队列queue,在这个队列中,所有元素是按优先级排列的(也可以认为queue是个按进入...

shzwork
03/09
11
0

没有更多内容

加载失败,请刷新页面

加载更多

CSS3 : transition 属性

本文转载于:专业的前端网站➧CSS3 : transition 属性 CSS3的 transition 属性用于状态过度效果! 1、语法: 1 transition: property duration timing-function delay;2 -moz-transition: ...

前端老手
29分钟前
6
0
一个简单的加密工具,性能貌似不行,待优化

一个简单的加密工具,性能貌似不行,待优化 package com.kxvz.common.crypt;import javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;import java.i......

Kxvz
31分钟前
5
0
vue实现路由懒加载

一、为什么要实现懒加载 减少首屏加载时间,避免白屏 二、常用的懒加载方式有两种:即使用vue异步组件 和 ES中的import a、vue异步加载: import Vue from 'vue' import Router from 'vue-ro...

Bing309
34分钟前
7
0
axios拦截器

axios.interceptors.response.use(response => { if (response.data.code == 0) { return response.data } else if (response.data.code == 600) { Cookies.remove('Admin-Token') router.pu......

Cyoya
36分钟前
6
0
给大家分享下部署云桌面的几个小技巧

从去年4月份开始我们公司就开始使用云桌面来进行上网办公的,在这一年多的使用过程中并没有出现像网上和有些用户说的那样,说云桌面各种坑老是出现这样和那样的问题,而我们之所以用的还不错...

GZASD
37分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部