c++ 有了emplace为什么要push
时间: 2023-09-18 10:02:46 浏览: 53
在C++中,emplace()和push()都是用于向容器中添加元素的函数。虽然它们都可以实现相似的功能,但在一些特定情况下,我们仍然需要使用push()函数。
首先,emplace()函数是在C++11中引入的,它可以传递构造函数中需要的参数,然后在容器中就地构造新的元素。它避免了额外的拷贝或移动操作,因此在性能上可能更高效。
但是,emplace()函数仅当我们知道如何传递构造函数参数时才能使用。如果我们只有元素的值,但没有其构造函数的参数列表,那么我们无法使用emplace()函数。在这种情况下,我们仍然需要使用push()函数来添加元素,因为它允许我们直接将值复制或移动到容器中。
此外,一些容器可能不支持emplace()函数,例如std::list以及一些旧版编译器。如果我们使用这些容器,那么我们只能使用push()函数来添加元素。
总结起来,虽然emplace()函数提供了一种更高效的方式来在容器中添加元素,但在某些情况下,我们依然需要使用push()函数。这取决于具体的情况以及我们是否需要传递构造函数参数。
相关问题
C++ emplace_back 和push_back()
`push_back()` 和 `emplace_back()` 都是用于向 C++ 容器中添加新元素的函数,但它们之间有一些区别。
`push_back()` 函数将元素加入容器的末尾。当我们使用 `push_back()` 添加元素时,我们需要创建一个元素的副本并将该副本添加到容器中。这意味着我们需要在内存中分配新的空间、构造新的元素对象、复制数据和销毁旧对象,这些操作可能会导致一些性能损失。因此,当我们添加已经存在的对象时,使用 `push_back()` 更合适。
而 `emplace_back()` 函数则更高效,因为它直接在容器的末尾构造新元素,而不是在内部创建一个临时对象。这意味着我们不需要进行额外的内存分配和复制操作,因此 `emplace_back()` 更适合创建新对象。同时,由于 `emplace_back()` 不需要创建临时对象,所以它比 `push_back()` 更快。
总之,如果我们只是添加已经存在的对象,那么 `push_back()` 是更好的选择,但如果我们需要构造新的对象,则 `emplace_back()` 更高效。
c++容器中emplace_back和push_back的区别
在C++容器中,`emplace_back`和`push_back`都是向容器尾部添加元素的方法,但它们有一些区别。
`push_back`方法接受一个已构造的对象,并将其拷贝或移动到容器中。这意味着在调用`push_back`时,需要先创建一个对象,然后将其添加到容器中。这可能会导致额外的对象构造和拷贝/移动操作。
而`emplace_back`方法则是直接在容器内构造对象,省去了额外的拷贝/移动操作。它接受构造函数的参数,并在容器内直接构造对象。这样可以避免不必要的对象构造和拷贝/移动操作,提高了性能。
因此,`emplace_back`通常比`push_back`更高效。但需要注意的是,使用`emplace_back`时需要确保容器内的对象类型具有对应的构造函数。