矢量清除与调整大小

SWK*_*WKK 12 c++

我在互联网上读到,如果你正在std::vector重复清理(紧密循环),最好使用resize(0)而不是clear(),因为它可能更快.我不确定这一点.有没有人对此有明确的答案?

Ash*_*ain 22

我认为你的意思是resize(0)代替setsize,而不是,而不是clear(),而你正在谈论std::vector.IIRC最近的一个答案讨论了这个(无法找到链接),而且在现代STL实现中,clear()可能与之相同resize(0).

以前清除向量可能已释放所有内存(即,其容量也降至零),当您再次开始添加元素时会导致重新分配,与resize(0)保持容量相比,重新分配的次数更少.但是,我认为在现代STL库中没有区别.如果您正在使用旧的STL实现,或者您只是偏执,resize(0)可能会更快.

  • 自 C++11 起,resize(0) 和clear() 之间存在重大区别。clear() 被定义为 noexcept。调用 resize(0) 可以防止调用函数成为 noexcept。 (3认同)

小智 5

当向量包含没有默认构造函数的类的对象时,clear 和 resize(0) 之间似乎存在差异。例如,以下代码将编译:

#include <vector>

class A {
private:
    int x,y;
public:
    A(int x,int y) :x(x), y(y) {}
};

int main() {
  std::vector <A> aa;

  aa.clear();
}
Run Code Online (Sandbox Code Playgroud)

但是如果你替换aa.clear()by aa.resize(0),你会得到编译错误:

error: no matching function for call to 'A::A()'
Run Code Online (Sandbox Code Playgroud)