之间有什么区别:
std::vector::erase
和
std::vector::clear
我想要做的是摆脱所有元素,位置,包括内存地址,并且不会抛出任何异常。
vector<array<double,1000>> S1(1000);
我想最终摆脱1000 * 2创建的内存地址。
答案 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)
擦除可让您指定开始和结束位置,而清除则清除整个矢量。
答案 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将用于删除所有向量元素,但擦除可以用于删除任何特定元素或元素范围。