C ++ STL容器插入副本

时间:2018-03-19 12:27:55

标签: c++ oop stl

我试图用std :: vector编写用户定义的对象。

我读到了User Defined类,如果Copy Constructor和Assignment Operator是public,那么只有一个可以在STL容器中插入它的对象。
这是因为两个原因::

  1. 所有STL包含始终存储插入对象的副本,而不是实际的副本。因此,每当我们在容器中插入任何元素或对象时,就会调用它的复制构造函数来创建副本,然后将此副本插入到容器中。
  2. 在std :: vector中插入时,由于空间不足,可能会在内部进行存储重定位。在这种情况下,将在容器内的对象上调用赋值运算符,以将它们从一个位置复制到另一个位置。


为什么所有STL容器始终存储插入对象的副本,而不是实际的副本? 我无法理解他们为什么不允许存储实际物体的原因。缺点是什么?

1 个答案:

答案 0 :(得分:1)

C ++中的标准容器分配他们管理的内存。如果你的程序创建了一个对象,那么该对象位于另一个内存位置,因此要成为容器的一部分,就会在容器的内存中创建一个副本。

而不是复制,移动可能已经完成,但在很多情况下,这样做效率会更高,有时甚至会非常不方便。

避免复制的一个好方法是使用emplace函数直接在容器中创建对象。

关于向量增长,因为新向量可能必须位于不同的内存地址而内存中包含对象,所以必须移动或复制它们。 This answer显示了如何在调整大小时使向量移动。