【问题标题】:std::vector inserts a copy or reference of an object?std::vector 插入对象的副本或引用?
【发布时间】:2011-12-17 14:17:06
【问题描述】:

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

【问题讨论】:

  • 请显示您正在考虑的代码:-)
  • 我说教的一面已经显露出来,我觉得我必须告诉你,你很可能不是指 STL,而是指 C++ 标准库。
  • C++ 标准库在其容器和算法中采用了 STL。因此,从技术上讲,STL 向量与 C++ 库向量相同。
  • 伙计,我曾经关心 STL 和 C++ 标准库之间的差异,但后来我加入了 Stack Overflow,我的堆栈开始溢出关于差异的挑剔的 cmets,我突然不再关心共。除非差异与您的问题相关(并且不在此处),否则我不明白它可能有什么关系。

标签: c++ vector reference copy


【解决方案1】:

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

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

澄清:不能在std::vector&lt;&gt; 中分配引用。另外,这里的object有更广泛的意义,可以是普通变量,也可以是指针,但std::vector&lt;&gt;只接受copy。

更新:在 C++11 之后,大多数标准容器使用“基于右值的 API 方法”提供对象的std::move();不能进行复制的地方。

【讨论】:

  • 我很惊讶,我认为编译器在某些情况下会优化掉复制操作,但发现它没有:ideone.com/b4fpc 即使使用 g++ -O6
  • 这个演示了通过复制一个 131 KB 的对象进行复制操作的代价:ideone.com/UNKyr
【解决方案2】:

如果您有一个动态分配的T 类型的对象,并且您将指向该对象的指针 推送到std::vector&lt;T*&gt;,则指针的副本 em> 被推。如果您取消引用指针并将结果推送到std::vector&lt;T&gt;,则会生成对象的副本。收藏总是复制。因此,指针集合复制指针,类实例集合复制实例本身(使用复制构造 IIRC)。

【讨论】:

    【解决方案3】:

    你检查过reference

    void push_back ( const T& x );
    

    在末尾添加元素

    在向量的最后一个元素之后添加一个新元素。 这个新元素的内容被初始化为 x 的副本。

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

    【讨论】:

      猜你喜欢
      • 2018-05-09
      • 1970-01-01
      • 2013-08-18
      • 2018-05-31
      • 2013-11-12
      • 2019-12-22
      • 1970-01-01
      • 2011-04-12
      • 1970-01-01
      相关资源
      最近更新 更多