矢量清除与调整大小

时间:2010-04-29 16:21:33

标签: c++

我在互联网上看到,如果您要重复std::vector(紧密循环),最好使用resize(0)代替clear(),因为它可能是快点。我不确定这一点。有没有人对此有明确的答案?

4 个答案:

答案 0 :(得分:20)

我认为你的意思是resize(0)而不是setsize,而是调用而不是clear(),并且你在谈论std::vector。 IIRC最近的回答讨论了这个问题(无法找到链接),在现代STL实施中,clear()可能与resize(0)相同。

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

答案 1 :(得分:3)

查看Dinkumware STL源,两者都有效地调用erase(begin(), end());

clear()稍微提高效率,不足为奇,因为它只有一个案例需要处理。但我不希望它是可测量的。

答案 2 :(得分:1)

这个声音实现具体,是您,您的图书馆和探查器的工作。但是正如我所看到的,我无法理解为什么resize(0)应该更快,因为它们实际上都必须调用erase(begin(),end())。

答案 3 :(得分:1)

当向量包含没有默认构造函数的类的对象时,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();
}

但如果您用aa.clear()替换aa.resize(0),则会出现编译错误:

error: no matching function for call to 'A::A()'