STL中push_back和emplace_back效率的对比

文章目录

  • 过程对比
    • 1.通过构造参数向vector中插入对象(emplace_back更高效)
    • 2.通过插入实例对象(调用copy函数)
    • 3.通过插入临时对象(调用move函数)
  • 效率对比
  • emplace_back 的缺点


我们以STL中的vector容器为例。我们来看看这两个函数的原型:

在这里插入图片描述
在这里插入图片描述

然后我们用一段代码来看看执行这两个函数时的过程:

#include<iostream>
#include <vector>
using namespace std;class MyTest
{
public://普通构造MyTest(int id,int age):m_id(id),m_age(age){ cout << "ceate MyTest class..." << this << endl;}//拷贝构造MyTest(const MyTest &t):m_id(t.m_id),m_age(t.m_age){  cout << "copy construct called..." << this << endl;}//移动构造MyTest(const MyTest &&t){m_id = std::move(t.m_id);m_age = std::move(t.m_age);cout << "move contruct called.." << this << endl;}//析构~MyTest(){cout << "destory MyTest class..." << this << endl;}
private:int m_id; //id成员int m_age;//age成员
};

过程对比

首先我们先总结它们的效率对比

  • 内置类型(built-in type):都一样
  • 用户自定义的类(User-defined type):emplace_pack仅在通过使用 构造参数 传入 的时候更高效!

1.通过构造参数向vector中插入对象(emplace_back更高效)

在这里插入图片描述

2.通过插入实例对象(调用copy函数)

在这里插入图片描述

3.通过插入临时对象(调用move函数)

在这里插入图片描述

效率对比

同样是在容器尾部增加一个元素,emplace_back 比 push_back 少了一次对象的构造和析构, 所以,emplace_back 比 push_back 更高效, 具体能高效多少呢,这里进行了一个插入 一百万 个对象的测试,emplace_back 比 push_back 快大概 20% ,下面是测试代码 :

//获取当前时间,单位: 毫秒
int64_t cur_msec()
{struct timespec tp1;clock_gettime(CLOCK_REALTIME, &tp1);return (tp1.tv_sec * 1000 + (int64_t)tp1.tv_nsec / 1000000.0);
}
//测试函数
void test()
{vector<MyTest> vec1;vector<MyTest> vec2;vec1.reserve(1000000);vec2.reserve(1000000);int64_t t1 = cur_msec();for (size_t i = 0; i < 1000000; i++){vec1.push_back(MyTest(1,20));}int64_t t2 = cur_msec();for (size_t i = 0; i < 1000000; i++){vec2.emplace_back(1,20);}int64_t t3 = cur_msec();cout << " push_back cost " << (t2 - t1) << " millisecond " << endl;cout << " emplace_back cost " << (t3 - t2) << " millisecond " << endl;
}

emplace_back 的缺点

既然 emplace_back 比 push_back 更高效,是不是每次都用 emplace_back 就完了呢?

我们日常写代码,除了执行率之外,还要考虑可读性,理解成本等,虽然emplace_back 效率高些,但是它也是有缺点的,比如:

vec1.push_back(1000000);
vec2.emplace_back(1000000);

第一行程序代码很好理解,往 容器vec1尾部加入一个整数 1000000,然而,第二行程序代码就不是很直观了,由于我们不知道 vec2 的实际类型,所以无法获得这行代码执行的结果。

假如,vec2 的类型是 vector,那么它的含义和第一行一样,往容器vec2尾部添加整数 1000000。

假如,vec2 的类型是 vector< vector >,那么它就构造了一个包含 1000000 个元素的容器,按照每个元素 4 个字节来计算,执行第二行代码需要分配差不多近 4M 的内存空间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/726844.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决 Pandas 导出文件出现 dtype: object 字样

文章目录 1. 问题2. 解决方法 1. 问题 python 用 pandas 输出 excel 文件时&#xff0c;发现有些列的单元格出现 “dtype: object” 的字样&#xff0c;如下图&#xff1a; 这是 pandas 没有处理好导致的 2. 解决方法 结果用 .values 进行输出&#xff0c;这样就转成字符串…

Vue的Diff详解

在 Vue 中&#xff0c;当我们更新数据时&#xff0c;Vue 会自动更新视图&#xff0c;这个过程就是虚拟 DOM 的 diff 算法。虚拟 DOM 是一种以 JavaScript 对象的形式表示 DOM 节点的方式&#xff0c;它可以更快地计算出需要更新的节点&#xff0c;从而提高渲染效率。 接下来&a…

聊天室项目

服务器 #include <myhead.h> #define SER_IP "192.168.122.39" #define SER_PORT 8888 typedef struct Node //链表存储客户端的所有信息 {struct sockaddr_in cin; //存储客户端的网络地址信息struct Node *next; }*List; typedef struct Message//消息结构…

洛谷 P1731 [NOI1999] 生日蛋糕

题目 题目链接 自己没看题解写的&#xff0c;摸石头过河&#xff0c;解释一下 首先&#xff0c;输入输出都是正整数。先搞定输入&#xff0c;再判断条件&#xff0c;如果无解&#xff0c;输出0&#xff0c;否则输出蛋糕外表面面积Q&#xff08;这里用全局变量&#xff0c;开l…

数据库的分类和特点介绍

#基础概念# #入门 数据库的主要分类 关系型数据库&#xff08;RDBMS&#xff09; 数据以表格形式存储&#xff0c;通过预定义的关系模型建立数据间的连接&#xff0c;使用SQL作为查询语言。常见的例子包括MySQL、Oracle、SQL Server、PostgreSQL、IBM DB2等。 非关系型数据库…

SEDEX验厂审核重点

SEDEX验厂简介 在全球化的今天&#xff0c;供应链的透明性和可持续性越来越受到人们的关注。为了确保供应链的合规性和可持续性&#xff0c;许多企业开始采用SEDEX验厂这一方法。SEDEX验厂是一种基于国际劳工组织&#xff08;ILO&#xff09;核心劳工标准的供应链审核体系&…

数据库:2024/3/6

作业1&#xff1a;使用C语言完成数据库的增删改 代码&#xff1a; #include <myhead.h>//定义添加员工信息函数 int Add_worker(sqlite3 *ppDb) {//准备sql语句printf("请输入要添加的员工信息:\n");//从终端获取员工信息char rbuf[128]"";fgets(r…

算法-买卖股票的最佳时机

1、题目来源 121. 买卖股票的最佳时机 - 力扣&#xff08;LeetCode&#xff09; 2、题目描述 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖…

React学习

&#x1f4d1;前言 本文主要是【React】——React基础的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一句&#x…

C++ 哈希表OJ

目录 1、1. 两数之和 2、面试题 01.02. 判定是否互为字符重排 3、217. 存在重复元素 4、 219. 存在重复元素 II 5、49. 字母异位词分组 频繁查找某一个数的时候可以使用哈希表&#xff0c;哈希表可以使用容器&#xff0c;也可以使用数组模拟&#xff0c;当元素是字符串中的字…

算法打卡day9|栈与队列篇01|Leetcode 232.用栈实现队列、225. 用队列实现栈

栈与队列理论基础 栈&#xff08;Stack&#xff09; 栈是一种后进先出&#xff08;LIFO&#xff09;的数据结构,即最近添加到栈中的元素将是第一个被移除的元素。 栈通常有两个主要的操作&#xff1a;push 用于添加一个元素到栈顶&#xff0c;而 pop 用于移除栈顶的元素。此外…

二维码样式修改如何在线处理?在电脑上改二维码图案的方法

随着网络的不断发展&#xff0c;二维码的应用场景不断增多&#xff0c;很多人都会将内容放到二维码中&#xff0c;通过扫码的方式将储存在云端的数据调取显示。而面对不同的用途时&#xff0c;对二维码的样式也会有单独的要求&#xff0c;比如需要改变颜色、加入文字、logo、尺…

网络调试助手使用MQTT协议与Mosquitto通信(3)

一、连接报文 一开始设备需要连接到mqtt服务器&#xff0c;连接时的数据包内需要携带对应的设备ID&#xff0c;以及用户名和密码。这使用默认的用户名和密码。设备ID每一个设备都需要设置为不同的&#xff0c;两个相同的ID只能允许一台设备在线&#xff0c;另一个相同的ID的设备…

【C++庖丁解牛】模版初阶

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 1. 泛型编程2. 函数模…

凌鲨微应用API大全

linksaas-minapp/api 获取微应用信息 export interface MinAppInfo {userId: string; //用户ID(未登录为空字符串)userDisplayName: string;crossHttp: boolean;//打开redis代理时会设置redisProxyToken?: string;redisProxyAddr?: string;//打开mongo代理时会设置mongoPro…

Dgraph 入门教程二《 快速开始》

1、Clound 云 云地址&#xff1a;Dgraph Cloud 登录Clound 云后&#xff0c;可以用云上的东西操作&#xff0c;可以用谷歌账号或者github账号登录。 启动云 &#xff08;1&#xff09;在云控制台&#xff0c;点击 Launch new backend. &#xff08;2&#xff09;选择计划&…

【PowerMockito:编写单元测试过程中原方法使用@Value注解注入的属性出现空指针】

错误场景 执行到Value的属性时会出现空指针&#xff0c;因为Value的属性为null 解决方法 在测试类调用被测试方法前&#xff0c;提前设置属性值&#xff0c;属性可以先自己定义好 ReflectionTestUtils.setField(endpointConnectionService, "exportUdpList", lis…

修改Yaml文件报错“块映射中的子元素无效”

开发环境 Golandpbyaml文件开发的 错误信息 新增了一个配置项&#xff0c;随后提示&#xff1a;“块映射中的子元素无效” 错误原因 yaml文件的格式要求严格&#xff0c;在:的后面要求有一个 空格&#xff0c;本次就是漏掉错误导致的犯错。 其他可能原因 以下答案来自GP…

工业深度学习异常缺陷检测实战

在工业生产过程中&#xff0c;由于现有技术、工作条件等因素的不足和局限性&#xff0c;极易影响制成品的质量。其中&#xff0c;表面缺陷是产品质量受到影响的最直观表现&#xff0c;因此&#xff0c;为了保证合格率和可靠的质量&#xff0c;必须进行产品表面缺陷检测。 “缺陷…