vector插入对象的副本或引用

std::vector inserts a copy or reference of an object?

本文关键字:引用 副本 插入 对象 vector      更新时间:2023-10-16

假设我有一个动态分配的对象。如果我将它推入STL向量,将引用插入到向量或该对象的副本中吗?

这是一个一般性的问题。例如:

class vec {
vector<obj> vec;
void addToVec(obj a) {
    // insert a into vec
 }
  ...
  ...
  ...
 }
obj* a = new obj;
 vec* v = new vec;
 vec.addToVec(a); 

如果我删除v,对象a也会死吗?

是将引用插入vector对象还是该对象的副本?

Copy(这意味着你的class应该是可复制的,否则编译错误)。

说明: std::vector<>中不能分配参考文献。另外,这里的对象有更广泛的意义,它可以是一个普通的变量,也可以是一个指针,但是std::vector<>只接受拷贝。

更新:在c++ 11之后,大多数标准容器使用"基于右值的API方法"提供了对象的std::move();不得复制的

如果您有一个动态分配的T类型的对象,并且您将指向该对象的指针压入std::vector<T*>,那么该指针副本将被压入。如果对指针解引用并将结果压入std::vector<T>,则生成该对象的副本。集合总是会生成副本。因此,指针的集合复制指针,类实例的集合复制实例本身(使用复制构造IIRC)。

您是否检查了参考:

void push_back ( const T& x );

在末尾添加元素

在vector对象的最后一个元素之后,在vector对象的末尾添加一个新元素。新元素的内容初始化为x的副本。

这有效地将vector的大小增加1,如果vector的大小等于调用前的vector容量,则会导致内部分配的存储空间重新分配。重新分配会使先前获得的所有迭代器、引用和指针失效