【问题标题】:Difference between two features of vector向量的两个特征之间的区别
【发布时间】:2013-06-24 08:28:00
【问题描述】:

两者有什么区别:

std::vector::erase

std::vector::clear

我想要做的是摆脱所有元素,位置,包括内存地址并且没有抛出异常。

vector<array<double,1000>> S1(1000);

最后我想摆脱 1000*2 创建的内存地址。

【问题讨论】:

  • 也许看看a good reference。听起来你想打电话给clear()
  • @Vijay remove != clear.
  • @juanchopanza 分配的内存显然不会被 Clear 释放。但我确实想释放内存。
  • “我想最后摆脱 1000*2 创建的指针。” - vector&lt;array&lt;double,1000&gt;&gt;(1000) 中没有 1000*2 指针,在哪里你是从哪里得到这个想法的?里面只有 1000 个std::array&lt;double,1000&gt;s,没有别的(而且也不包含任何指针)。

标签: c++ vector


【解决方案1】:

erase 按位置选择性地删除元素。 clear 无条件删除所有元素,可以认为是调用v.erase(v.begin(),v.end()); 的语法糖

【讨论】:

  • 删除内存地址怎么办,我用erase吗?
  • 删除哪些内存地址?您可能需要显示一些代码(或提出更具体的问题)
【解决方案2】:

我能想到的唯一确定的释放内存的方法是用一个临时向量交换:

vector<array<double,1000>> S1(1000);
...
vector<array<double,1000>>().swap(S1);

虽然这乍一看可能很奇怪,但它是一个广为人知且广泛使用的成语。

在 C++11 中,从原始向量移动可能是一种选择,尽管不能保证清除内存甚至清除向量(但我想不出实现不这样做的原因) :

{
  vector<array<double,1000>> tmp(std::move(S1));
} // tmp dies on exiting scope, memory is cleared

或者,调用std::vector::shrink_to_fit 可能会导致内存释放,但不能保证:

S1.clear();
S1.shrink_to_fit();

【讨论】:

  • 在 C++11 中,std::vector 有一个 shrink_to_fit 成员,应该是最好的解决方案。 (该标准在这方面并不能保证太多,但 QoI 应该意味着它有效。)
  • 在我看来,move 的解决方案更像是一种混淆。
  • @JamesKanze “标准在这方面并不能保证太多” - 这就是为什么它是一个完全垃圾功能的问题。当然,如果不正确实现shrink_to_fit,实现会很愚蠢,但这不是标准所保证的。这就像说“这里你有固定宽度的整数类型,除非你没有”。虽然我同意移动解决方案是违反直觉的。
  • @JamesKanze 我添加了一条关于shrink_to_fit 的行。我认为交换技巧是唯一有保证的方法,但它对我来说仍然有点像 hack。
  • @jogojapan 实际上,erase 更糟。 erase 可以抛出的唯一原因是 T 的复制构造函数或赋值运算符抛出(因此它不能在 std::vector&lt;int&gt; 上抛出)。 shrink_to_fit 也需要分配,这也可能失败。
【解决方案3】:

Erase 可让您指定开始和结束位置,而 clear 清除整个 Vector。

http://www.cplusplus.com/reference/vector/vector/erase/

http://www.cplusplus.com/reference/vector/vector/clear/

【讨论】:

    【解决方案4】:

    函数clear() 清空向量。函数erase() 删除选择性元素(有几个overloads)。 erase(v.begin(), v.end()); 相当于调用clear();。创建的内存仍将保留以备将来使用。如果您想确保释放所有这些内存,请调用v.clear();,然后调用v.shrink_to_fit()(如果您有 C++11 编译器)。 (实际上并不能保证会释放内存,这只是一个请求,但我不知道有任何编译器不会释放内存。)如果您不符合 C++11 标准,请使用替代方案std::vector&lt;std::array&lt;double,1000&gt;&gt;().swap(v);。这就是shrink to fit idiom

    【讨论】:

      【解决方案5】:

      v.erase(v.begin(),v.end()) 等价于 v.clear() 其中 v 是任何向量的对象。这里 clear 将用于删除所有向量元素,但 erase 可以用于删除任何特定元素或元素范围。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-14
        • 2018-05-20
        • 1970-01-01
        • 2022-11-27
        • 1970-01-01
        • 2011-01-01
        • 2011-11-01
        相关资源
        最近更新 更多