(7个答案)
6年前关闭。
试图了解使用
push()
或emplace()
的区别。我当时在想,如果我创建
std::stack
,那么我会使用std::stack<int>
,因为integer是原始类型,而push()
则没有任何构造。但是,如果我创建的是
emplace()
,那么我会选择std::stack<string>
,因为emplace()
是一个对象。这是正确用法吗?
最佳答案
要完全了解emplace_back的功能,必须首先了解可变参数模板和右值引用。
在现代C++中,这是一个相当高级且深入的概念。在 map 上,它将被标记为“有龙”。
您说您是C++的新手,正在尝试学习这些知识。这可能不是您要找的答案,但是您现在应该跳过此详细信息,等到您将脑袋围绕可变参数模板和右值引用之后再回来。然后一切都应该有意义。
但是,如果您坚持认为:对于包含简单的基本类型(例如整数)的容器,几乎没有任何区别。区别在于容器的类型是一些大型的,复杂的类,具有复杂的构造函数和/或复制构造函数。
push或emplace的最终结果是完全相同的100%。容器将附加另一个元素。区别在于元素来自何处:
1)push接受一个现有元素,并将其副本附加到容器中。简单,直接。 push始终只接受一个参数,即要复制到容器的元素。
2)emplace在容器中创建该类的另一个实例,该实例已经附加到容器中。 emplace的参数将作为参数转发给容器的类的构造函数。如果类具有默认构造函数,则Emplace可以具有一个参数,多个参数或完全没有参数。
请注意,当类的构造函数使用一个参数且未将其标记为explicit
时,可能会滥用push并将其传递给构造函数参数,而不是该类的现有实例。但是,让我们假装此选项不存在,它经常导致糟糕的代码性能,尤其是对于非平凡的类。
因此:如果要将类的现有实例的副本添加到容器,请使用push。如果要从头开始创建该类的新实例,请使用emplace。
关于c++ - C++:堆栈的push()与emplace(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26198350/