push_back和emplace_back

2024-04-16 02:52
文章标签 push back emplace

本文主要是介绍push_back和emplace_back,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

push_back

push_back 接受一个元素作为参数,并将其拷贝或移动到容器末尾。

当使用 push_back 时,参数会被拷贝或移动到容器中,因此会调用元素类型的拷贝构造函数或移动构造函数。

std::vector<int> vec;
int value = 10;
vec.push_back(value); // 拷贝 value 到容器末尾

emplace_back

emplace_back 接受一个参数列表,并在容器末尾就地构造一个新元素。

当使用 emplace_back 时,参数列表会直接传递给元素类型的构造函数,因此不会发生拷贝或移动操作,而是直接在容器中构造新元素。

std::vector<std::string> vec;
vec.emplace_back("hello"); // 在容器末尾构造一个新的 std::string 对象

主要的区别和使用场景

对于构造一个新元素而言,使用 emplace_back 相比于 push_back 效率更高的主要原因有两点:

减少了拷贝/移动的开销: 使用 emplace_back 时,参数会直接传递给元素类型的构造函数,而不需要进行额外的拷贝或移动操作。相比之下,使用 push_back 时需要将对象拷贝或移动到容器中,会涉及到额外的拷贝构造函数或移动构造函数的调用。因此,emplace_back 避免了不必要的拷贝或移动操作,从而提高了效率。

直接在容器中构造元素: 使用 emplace_back 时,元素会直接在容器内部就地构造,而不是首先构造一个临时对象,然后再将其拷贝或移动到容器中。这样可以避免不必要的临时对象的构造和销毁,从而减少了额外的开销,提高了效率。

总的来说,emplace_back 的效率更高主要是因为它避免了不必要的拷贝或移动操作,以及不必要的临时对象的构造和销毁,直接在容器内部就地构造新元素。因此,在需要构造新元素时,尤其是对于大型对象或不能被移动的对象的容器来说,推荐使用 emplace_back 来提高效率。

 

这篇关于push_back和emplace_back的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/907624

相关文章

MongoDB学习—(5)修改器$inc,$unset,$push,$pushAll,$allToSet,$pop,$pull,$pullAll

通过db.help()可以查询到关于数据库的操作,一查询发现有很多方法 其中有一个方法为db.getCollection(cname),即通过这一个函数,传入数据库中的一个集合的名称来获取到该集合的一个对象,我们可以编写函数   function insertTenRecord(obj){ var i=0; while(i++<10){ obj.insert({id:i+1,a

王立平--Failed to push selection: Read-only file system

往android模拟器导入资源,失败。提示:只读文件、 mnt是只读文件。应点击sdcard,,在导入

Flink Back Pressure

什么是 Back Pressure 如果看到任务的背压警告(如 High 级别),这意味着 生成数据的速度比下游算子消费的的速度快。以一个简单的 Source -> Sink 作业为例。如果能看到 Source 有警告,这意味着 Sink 消耗数据的速度比 Source 生成速度慢。Sink 正在向 Source 施加反压。 许多情况都会导致背压。例如,GC导致传入数据堆积,或者数据源在发送数

idea向git上推送被拒绝 push to master was rejected

当你在尝试将代码推送到远程仓库(如 GitHub、GitLab 或 Bitbucket)的 origin/master 分支时遇到“Pushrejected: Push to origin/master was rejected”这样的错误,这意味着远程仓库对你的推送请求进行了一些限制或者你的本地仓库与远程仓库的状态不一致。 1. 远程分支保护 许多仓库(尤其是主分支,如 master

Spark-push-based shuffle

一、上下文 《Spark-Task启动流程》中讲到如果一个Task是一个ShuffleMapTask,那么最后在调用ShuffleWriter写入磁盘后还会判断是否可以启用push-based shuffle机制,下面我们就来继续看看push-based shuffle机制背后都做了什么 二、push-based shuffle机制开启条件 1、spark.shuffle.push.enab

[C++11#46](三) 详解lambda | 可变参数模板 | emplace_back | 默认的移动构造

目录 一.lambda 1. 捕捉列表 2. 底层原理 二. 可变参数模板 1. 递归函数方式展开参数包 2. 数组接收方式展开参数包 3. 运用 4.emplace_back 5.移动构造和拷贝构造 强制生成 default 一.lambda 可调用类的对象 函数指针--少用 void(*ptr) (int x) 仿函数--构造类 重载 operator() 对象

vector中的push_back()和emplace_back()的区别、以及使用场景

目录 前言 1. 基本区别 2. 性能差异 3. 构造参数传递 4. 使用场景总结 前言 push_back() 更适合在已经有对象实例的情况下使用。emplace_back() 则更适合需要在容器内部直接构造对象的场景,特别是在性能敏感的情况下。 1. 基本区别 push_back(): 作用:将一个已构造的对象或临时对象复制或移动到容器的末尾。使用场景:适合在

关于adb push 带空格的文件到机台中

adb root adb remount adb shell "mkdir /sdcard/DCIM/Tsfile " adb push "JPN TS002a_yokohama.ts"  /sdcard/DCIM/Tsfile/

git push代码失败

git push --no-thin origin HEAD:refs/for/dev-rt

C++ emplace emplace_back是什么 替代 insert

在C++开发过程中,我们经常会用STL的各种容器,比如vector,map,set等,这些容器极大的方便了我们的开发。在使用这些容器的过程中,我们会大量用到的操作就是插入操作,比如vector的push_back,map的insert,set的insert。这些插入操作会涉及到两次构造,首先是对象的初始化构造,接着在插入的时候会复制一次,会触发拷贝构造。但是很多时候我们并不需要两次构造带来效率的