emplace_back() push_back()

文章讨论了emplace_back和push_back在向vector添加类对象时的行为差异,指出emplace_back在添加有参构造的元素时效率更高,且外部修改不影响内部对象。同时强调了类修改对两者的影响不同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

假设 vector 中元素类型是类类型,那么 emplace_back() 待添加的元素的类型是类中有参构造的参数类型时,emplace_back() 比 push_back() 少一次移动或拷贝构造函数。而如果添加的元素是类类型的对象时,则和 push_back() 一样都只会调用一次移动构造函数或一次拷贝构造函数。
————————————————
版权声明:本文为优快云博主「unonoi」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/unonoi/article/details/114680819

emplace_back或者push_back类进去之后,类在外面被修改了,里面是不会被修改的,但是如果是一个vector被推进去,外面被修改了,里面是会被修改的

### C++ 中 `push_back` 和 `emplace_back` 的区别 #### 定义与功能 `push_back` 和 `emplace_back` 都用于向标准库容器(如 `std::vector` 或 `std::deque`)的末尾添加元素。然而,两者的实现方式存在显著差异。 对于 `push_back` 方法,在将新元素加入容器之前,会先创建该类型的临时对象,随后通过拷贝或移动操作将其传递给容器[^1]。这意味着可能会涉及额外的对象构造和销毁开销。 相比之下,`emplace_back` 则更为直接:它利用传入的参数原位构建目标类型的新实例于容器内部存储空间之中,从而省去了中间环节中的复制或者转移过程[^2]。 #### 性能考量 当性能成为首要考虑事项,并且能够提前知晓待插入项的确切初始化数据时,则推荐采用 `emplace_back` 来代替传统的 `push_back` 方式来提升运行效率[^3]。这是因为前者减少了不必要的构造/析构动作次数——仅需执行单次构造即可完成整个流程;后者则至少要经历两次这样的生命周期事件(即原始实体建立加上后续迁移至最终位置的动作),这无疑增加了计算负担尤其针对复杂结构体而言尤为明显[^4]。 以下是简单的代码示例展示两种方法的应用: ```cpp #include <iostream> #include <vector> class MyClass { public: int value; // Constructor with parameter explicit MyClass(int val):value(val){ std::cout << "Constructor called\n"; } }; int main(){ std::vector<MyClass> vec; // Using push_back creates a temporary object first. vec.push_back(MyClass(10)); // Using emplace_back constructs the object directly inside the container. vec.emplace_back(20); return 0; } ``` 上述程序片段中可以看到,当我们使用 `push_back` 添加一个新的 `MyClass` 实例到矢量列表里边的时候,实际上发生了两个阶段的操作—先是制造了一个短暂存在的局部变量,接着才把这个东西搬移到集合当中去。但是切换成运用 `emplace_back` 后面就只发生了一步行动,也就是直接依据所提供的数值建立起那个成员本身的位置上所需的数据单元而已。 #### 使用场景分析 尽管如此,还是应该注意到并非任何时候都适合选用 `emplace_back`. 如果当前所处理的是相对较为基础或者是已经预先定义好的现成物件的话,那么继续沿用熟悉的 `push_back` 可能反而显得更加简洁明了而且易于维护理解. 此外值得注意的一点就是关于兼容性的议题,因为毕竟不是所有的开发环境都能够支持最新版本的标准特性,所以在决定采纳哪一种策略前也得充分评估项目实际状况以及团队成员的技术水平等因素综合判断最为恰当的选择方案才是明智之举. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值