【问题标题】:Containers in C++11 STLC++11 STL 中的容器
【发布时间】:2014-07-19 11:03:07
【问题描述】:
struct Solution {
  double power_peak;
  valarray<int> assignment;
};
list<Solution> list;
list.pop_back();

list<Solutions *> list2;
list2.pop_back();
function(list2);

您好,我仍然不明白这些容器在内容方面是如何工作的。 假设他们之前被填满。 当我在第一个列表上调用 pop_back 时。我假设一切都被破坏了(包括 Valarray 中的 int) 当我在第二个列表上调用 pop_back 时。内容仍然存在。

当我进行函数调用时。列表的行为是否类似于指向数组的指针?所以只复制了指针,但它们仍然指向相同的内容。

这对吗?

vector 或 valarray 在复制方面会表现得其他方面吗?

【问题讨论】:

  • 行为在某种程度上取决于function的声明...
  • 发布的代码执行未定义的行为:请在删除最后一个元素之前填充容器,或编辑您的示例。

标签: c++ std standard-library


【解决方案1】:

当您pop_back() 来自list 的元素或任何支持pop_back() 的序列容器时,它总是会导致最后一个元素的破坏。不同之处在于,在第二种情况下,list 包含指针,而指针的析构函数是 NOP。这就是为什么指针指向的内容仍然存在的原因。

这也是不赞成将原始指针插入容器的原因。这意味着您必须手动管理内存,这很容易出错。使用list&lt;unique_ptr&lt;T&gt;&gt; 或其他一些智能指针意味着您不再需要手动管理内存。

当我进行函数调用时。列表的行为是否类似于指向数组的指针?所以只复制了指针,但它们仍然指向相同的内容。

这取决于函数是如何定义的。如果是以下情况之一:

return_type function(list_type&);
return_type function(list_type const&);

不会复制。对列表的引用将传递给函数。另一方面,如果定义为:

return_type function(list_type);

然后列表将被复制。

【讨论】:

    【解决方案2】:

    当我进行函数调用时。列表的行为是否类似于指向 数组?

    不,它的行为类似于指向对象的指针列表。就是这样。

    所以只有指针被复制,但它们仍然指向同一个 内容。

    正确。

    我假设一切都被破坏了(包括 Valarray 中的 int)

    正如您可能读到的herepop_back 会破坏序列容器中的最后一个元素,如果它是一个类,那么它的成员也是不言而喻的。

    当我在第二个列表上调用 pop_back 时。内容仍然存在。

    由于指针不智能,它们不拥有它们所指向的对象。所以如果你销毁指针,对象不会受到影响。

    【讨论】:

      猜你喜欢
      • 2016-01-13
      • 2013-07-02
      • 2012-10-07
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      • 2012-02-08
      相关资源
      最近更新 更多