std :: vector插入对象的副本或引用?

时间:2011-12-17 14:17:07

标签: c++ vector reference copy

假设我有一个动态分配的对象。 如果我将它推入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,还会反对死亡吗?

3 个答案:

答案 0 :(得分:9)

  

是否会将引用插入到该向量或该对象的副本中?

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

澄清:无法在std::vector<>中分配参考。此外,这里的对象具有更广泛的意义,它可以是普通变量或指针,但std::vector<>只接受副本。

更新:在C ++ 11之后,大多数标准容器使用“rvalue baed API方法”提供对象的std::move();无法复制的地方。

答案 1 :(得分:7)

如果您有一个类型为T的对象,您已动态分配并将指针指向对象推送到std::vector<T*>,那么副本指针被推送。如果取消引用指针并将结果推送到std::vector<T>,则会生成对象的副本。收藏总是复制。因此,指针集合使指针和类实例集合的副本能够复制实例本身(使用复制结构IIRC)。

答案 2 :(得分:2)

您是否选中了 reference

void push_back ( const T& x );

在末尾添加元素

在向量的末尾添加一个新元素,在其当前的最后一个元素之后。 此新元素的内容初始化为x。

的副本

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