C++ C++;STL容器插入副本

C++ C++;STL容器插入副本,c++,oop,stl,C++,Oop,Stl,我试图用std::vector编写用户定义的对象我了解到,对于用户定义的类,如果复制构造函数和赋值运算符是公共的,那么只有一个可以在STL容器中插入其对象。这是因为两个原因: 所有STL包含始终存储插入对象的副本,而不是实际对象的副本。所以,每当我们在容器中插入任何元素或对象时,就会调用它的复制构造函数来创建一个副本,然后将该副本插入容器中 在std::vector中插入时,可能由于空间不足而在内部发生存储重新定位。在这种情况下,将对容器内的对象调用赋值运算符,以将它们从一个位置复制到另一个位置

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

  • 所有STL包含始终存储插入对象的副本,而不是实际对象的副本。所以,每当我们在容器中插入任何元素或对象时,就会调用它的复制构造函数来创建一个副本,然后将该副本插入容器中

  • 在std::vector中插入时,可能由于空间不足而在内部发生存储重新定位。在这种情况下,将对容器内的对象调用赋值运算符,以将它们从一个位置复制到另一个位置。


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

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

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

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


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

    值语义是C++容器的关键点。“复制”与“实际对象”是什么意思?容器中的对象是实际对象,如果需要,可以就地构造它们。因为容器存储值(不是引用或指针),所以当你推送一个值时,它们需要进行复制,所以如果项目没有被复制;如何在没有UB的情况下推回本地到循环项?考虑这个非常简化的“容器”:<代码> Stutt SunLyIn int {int x;单列int(int y):x(y){}};
    无法让它存储您传递给它的
    int
    ,但它存储一个副本,因为它正在管理自己的资源。您可以在容器中存储指向对象的(智能)指针,或插入对象的副本。实际上,由于C++11,std::vector的push_back也可以接受右值。因此,除了可以将副本添加到向量之外,还可以在中移动值。