This question already has answers here:
push_back vs emplace_back

(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/

10-11 17:06