首页 > 后端开发 > C++ > Push_back 与 Emplace_back:什么时候应该在 C 中使用它们?

Push_back 与 Emplace_back:什么时候应该在 C 中使用它们?

Mary-Kate Olsen
发布: 2024-12-23 09:47:29
原创
714 人浏览过

Push_back vs. Emplace_back: When Should You Use Each in C  ?

Push_back 与 Emplace_back:深入分析

简介

push_back 和 emplace_back 的区别C 中的操作常常是混乱的根源。这两个函数都用于将元素插入到容器中,但它们的行为不同,尤其是在使用右值引用时。

理解 Push_back

push_back 有三个重载:一种采用 const 值,一种采用右值引用,另一种采用可变数量的参数(C 11 及以上)。在右值引用的上下文中,push_back(Type&& _Val) 的行为符合预期:它直接将右值引用插入到容器中,而不创建副本。

Emplace_back 的出现

Microsoft Visual C (MSVC) 引入了一个看似冗余的 emplace_back 版本,它采用右值引用: emplace_back(类型&&_Val)。此重载是多余的,因为与右值引用一起使用时,它在功能上等同于 Push_back(Type&& _Val)。

Emplace_back 的真正威力

真正的emplace_back 的潜力在于其可变参数重载:emplace_back(Args&&...)。与push_back不同,此重载允许使用转发参数直接构造容器内的对象。这消除了创建临时对象的需要以及不必要的复制的可能性。

何时使用 Emplace_back

emplace_back 在创建临时对象会产生重大损失的情况下特别有用开销。例如,将复杂对象插入标准映射时:

std::map<int, Complicated> m;
int anInt = 4;
double aDouble = 5.0;
std::string aString = "C++";

// Avoids creating temporary objects
m.emplace(4, anInt, aDouble, aString);
登录后复制

MSVC 的部分实现

尽管为右值引用引入了非标准 emplace_back 重载,MSVC尚未实现完整的可变版本。其背后的原因是当时 Visual C 10 中缺乏可变参数模板支持。

以上是Push_back 与 Emplace_back:什么时候应该在 C 中使用它们?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板