gpt4 book ai didi

C++:堆栈的 push() 与 emplace()

转载 作者:IT老高 更新时间:2023-10-28 21:38:09 26 4
gpt4 key购买 nike

试图了解使用 push() 之间的区别或 emplace()对于 std::stack .

我在想如果我创建一个 std::stack<int> ,然后我会使用 push()因为整数是原始类型,emplace() 没有任何内容构建。

但是,如果我正在创建 std::stack<string>那么我会选择emplace()因为std::string是一个对象。

这是正确的用法吗?

最佳答案

要完全理解 emplace_back 的作用,首先必须了解可变参数模板和右值引用。

这是现代 C++ 中一个相当先进和深刻的概念。在 map 上,它会被标记为“有龙”。

你说你是 C++ 的新手,并试图学习这些东西。这可能不是您正在寻找的答案,但您现在应该跳过这个细节,等您将大脑包裹在可变参数模板和右值引用上之后再回来。那么这一切都应该是有意义的。

但如果您坚持:对于包含简单的基本类型(如整数)的容器,几乎没有区别,如果有的话。当容器的类型是一些大型的、复杂的类,具有复杂的构造函数和/或复制构造函数时,差异就出现了。

push 或 emplace 的最终结果完全相同,100% 相同。容器获取附加到它的另一个元素。不同之处在于元素的来源:

1) push 获取一个现有元素,并将其拷贝附加到容器中。简单,直接。 push 总是只接受一个参数,即要复制到容器的元素。

2) emplace 在容器中创建该类的另一个实例,该实例已经附加到容器中。 emplace 的参数作为参数转发给容器类的构造函数。如果类具有默认构造函数,Emplace 可以有一个参数、多个参数或根本没有参数。

请注意,当类的构造函数采用一个参数且未标记为 explicit 时,可能会滥用 push 并向其传递构造函数参数,而不是现有的类实例。但是让我们假设这个选项不存在,它通常会导致糟糕的代码性能,尤其是对于非平凡的类。

所以:如果您想将现有类实例的拷贝添加到容器中,请使用 push。如果您想从头开始创建该类的新实例,请使用 emplace。

关于C++:堆栈的 push() 与 emplace(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26198350/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com