C++中vector的insert和emplace有什么区别

San*_*pjn 6 c++ vector

除了使用emplace进行单次插入和使用向量中的insert进行多次插入之外,它们的实现还有其他不同之处吗?

在两种情况下,插入任何元素都会移动所有其他元素.

Alo*_*ave 10

std::vector::insert 通过调用复制构造函数或移动构造函数将元素复制移动到容器中.
while,
In std::vector::emplace元素就地构造,即不执行复制或移动操作.

后来是从C++ 11开始引入的,如果复制你的类是一项非常重要的操作,那么它的使用是可取的.

  • @David:首先,它是一个带有参数包的函数模板,所以正确地实现/模拟它你需要可变参数模板(和完美的转发)。它实际上所做的是像平常一样获取向量所需的内存,然后使用放置 new,将其参数转发到与它们匹配的任何构造函数。我说“使用新的放置”:它使用分配器接口,但“std::allocator”使用新的放置。相比之下,“insert”始终使用复制/移动向量,但在传递一个兼容类型的参数的情况下,在调用之前可能会存在隐式转换。 (2认同)

Pet*_*ker 3

主要区别在于,它insert采用与容器类型相同的对象并将该参数复制到容器中。emplace接受或多或少任意的参数列表,并根据这些参数在容器中构造一个对象。