资料参考:

https://blog.csdn.net/p942005405/article/details/84764104

实际精华在评论中,转载如下:

STL的实现版本很多,VS、GCC版本不同,实现都不同,建议翻看STL源代码。 新版本的原型展示: void push_back(const value_type& x); void push_back(value_type&& x); <typename... Args> reference emplace_back(Args&&... args); 两者区别:push_back传入一个事先存在的元素对象,调用的是拷贝或移动构造来生成这个新压入的元素对象:construct(*des, class_name&|&& x)) emplace_back:多个事先存在的对象,调用示义:construct(*des, other_type &x|&&x, type_name &|&&,...) emplace_back传参不定,编译器需要在调用时才生成具体的实现,push_back只是emplace_back的两个偏移化版本! push_back只能用类中的拷贝或移动构造,而emplace_back还可以是类中的其他多参数的构造函数,这是优点也是缺点(代码翻倍)&&在普通函数中作为参数时,是万能引用,并不是右值引用,在函数体中会使用forward完美转发,调用时是复制或移动和你传的值有关,你传左值它就用左值版本,传右值就用右值版本,心里要有数。如果一个类没有上诉的拷贝或移动构造,则不能用于STL容器中,如果没有相应参数类型的构造实现,emplace_back编译不过,找不到它需要的对应构造函数.. move和copy构造唯一区别:move时,指针属性只是简单的拷贝指针,而copy中,指针属性被拷贝的同时,它所指的具体内容也还需要深度copy下去...我们在实现类的两个构造时特别要注意这一点,move中要将旧对象的指针属性置nullptr,这意味着相应的对象不再适合使用了(它必须是临时对象的原因!转移后,内部的指针属性失效!) move和copy的性能对比:正如上说,move只是指针优化,如果类本身没有指针属性,则它不需要move,我们也不必强制move不可,copy和move在内置类型和简单类型(指无指针属性、即构造时不需要new)没区

emplace_back与push_back的更多相关文章

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

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

  2. 学习 emplace_back() 和 push_back 的区别 emplace_back效率高

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

  3. 编程杂谈——使用emplace_back取代push_back

    近日在YouTube视频上看到关于vector中emplace_back与push_back区别的介绍,深感自己在现代C++中还是有不少遗漏的知识点,遂写了段代码,尝试比较两者的差别. 示例代码 #i ...

  4. emplace_back与push_back的区别

    std::vector::emplace_back     C++   Containers library   std::vector   template< class... Args &g ...

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

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

  6. emplace_back() 和 push_back 的区别(转)

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

  7. (转)C++11使用emplace_back代替push_back (其中有关于右值引用)

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

  8. C++ std::vector emplace_back 优于 push_back 的理由

    #include <iostream> #include <vector> #include <chrono> #include <windows.h> ...

  9. 【C/C++开发】emplace_back() 和 push_back 的区别

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

  10. emplace_back() 和 push_back 的区别

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

随机推荐

  1. Spark调优 | Spark Streaming 调优

    Spark调优 | Spark Streaming 调优 1.数据序列化 2.广播大变量 3.数据处理和接收时的并行度 4.设置合理的批处理间隔 5.内存优化 5.1 内存管理 5.2优化策略 5.3 ...

  2. svn 启动项目报错,项目被lock

    问题描述 问题解决 (一)Eclipse SVN 插件处理 (二)SVN 客户端处理 (三)删除lock文件 问题描述 在使用开发工具开发项目时(如Eclipse),在做项目的中途,有时候Eclips ...

  3. Django(简介)

    Django django对大家来说肯定不陌生啦,下面就简单的介绍一下,基础的使用以及django的特点吧 Python下有许多款不同的 Web 框架.Django是重量级选手中最有代表性的一位.许多 ...

  4. php文件下载的实现(header)

    php文件下载的实现(header) $file_xls=$path;    //   文件的保存路径 $example_name=basename($file_xls);  //获取文件名   he ...

  5. springBoot之 spring-boot-starter-parent 引入详解

    springBoot中引入 <parent> <groupId>org.springframework.boot</groupId> <artifactId& ...

  6. Centos根目录100%解决思路

    Centos 7 根目录(爆满)100%解决思路,下面以宝塔面板环境为例 1.首先远程到服务器,在~下输入df -h ,看下根目录下文件夹使用情况 [root@localhost~]# df -h F ...

  7. 2019牛客暑期多校训练营(第四场)D-triples I

    >传送门< 题意:求最少需要多少个3的倍数按位或后可以得到数字a 思路:利用3的倍数对应的二进制数的性质来先选出一个x,然后根据数字a再配一个y出来 首先,我们都知道十进制中,任意一个数只 ...

  8. 关于最小生成树 Kruskal 和 Prim 的简述(图论)

    模版题为[poj 1287]Networking. 题意我就不说了,我就想简单讲一下Kruskal和Prim算法.卡Kruskal的题似乎几乎为0.(●-`o´-)ノ 假设有一个N个点的连通图,有M条 ...

  9. hdu4325 Flowers

    Problem Description As is known to all, the blooming time and duration varies between different kind ...

  10. Codeforces Round #670 (Div. 2) A. Subset Mex (贪心)

    题意:给你一长度为\(n\)的序列,将其分为两个集合,求两个集合中未出现的最小元素的最大值, 题解:用桶存一下每个元素的个数,两次枚举\([1,100]\),找出两个最小值即可. 代码: int t; ...