C++ STL 容器插入副本

C++ STL container insertion copy

本文关键字:插入 副本 STL C++      更新时间:2023-10-16

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

我读到对于用户定义的类,如果复制构造函数和赋值运算符是公共的,那么只有一个可以在 STL 容器中插入其对象。
这是因为两个原因:

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

为什么所有 STL 容器总是存储插入对象的副本,而不是实际对象的副本?
我不明白为什么他们不允许存储实际对象的原因。 缺点是什么?

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

代替复制,本来可以完成移动,但在很多情况下,这不会更有效率,有时甚至可能非常不方便。

避免复制的一个很好的解决方案是使用emplace-functions直接在容器中创建对象。

关于向量增长,因为新向量可能必须位于不同的内存地址并且内存包含对象,因此必须移动或复制它们。此答案显示了如何在调整大小时使矢量移动。