矢量的两个特征之间的差异

时间:2013-06-24 08:28:01

标签: c++ vector

之间有什么区别:

std::vector::erase

std::vector::clear

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

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

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

5 个答案:

答案 0 :(得分:4)

erase通过位置选择性地摆脱元素。 clear无条件地删除所有元素,并且可以被视为调用v.erase(v.begin(),v.end());

的语法糖

答案 1 :(得分: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();

答案 2 :(得分:0)

擦除可让您指定开始和结束位置,而清除则清除整个矢量。

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

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

答案 3 :(得分:0)

函数clear()清空向量。函数erase()删除了选择元素(有几个overloads)。 erase(v.begin(), v.end());相当于调用clear();。创建的内存仍将保留,以备将来使用。如果您想确保释放所有这些内存,请调用v.clear();然后调用v.shrink_to_fit(),如果您有C ++ 11编译器。 (没有实际保证内存将被释放,它只是一个请求,但我不知道任何编译器没有释放内存。)如果你没有C ++ 11合规性,那么使用替代std::vector<std::array<double,1000>>().swap(v);。这叫做shrink to fit idiom

答案 4 :(得分:0)

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