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中文网其他相关文章!