2010-04-29 81 views
5

我在互联网上读到,如果您重复清除std::vector(处于紧密环路中),最好使用resize(0)而不是clear(),因为它可能更快。我不确定这一点。有没有人对此有明确的答案?矢量清除与调整大小

+1

你可以尝试这两种方法,并告诉我们如何去? – 2010-04-29 16:23:04

+0

假设你的意思是'resize(0)'? – Roddy 2010-04-29 16:34:55

回答

13

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

以前清除矢量可能释放了所有内存(即其容量也降为零),导致在重新添加元素时重新分配,与保留容量的resize(0)不同,因此重新分配的次数较少。但是,我认为在现代STL库中没有区别。如果你使用旧的STL实现,或者你只是偏执狂,resize(0)可能会更快。

+0

或使用MFC,它的数组(即矢量)类有一个setsize,其有效地调整大小 – 2010-04-29 16:29:15

+0

我不知道MFC的容器,OP说矢量,所以我认为他们的意思是'std :: vector '。 – AshleysBrain 2010-04-29 16:30:20

1

这个声音实现特定,是你,你的图书馆和一个分析器的工作。但正如我所看到的,我不明白为什么resize(0)应该更快,因为两者实际上都必须调用erase(begin(),end())。

2

看着Dinkumware的STL源,既有效地调用erase(begin(), end());

clear()会更有效,毫不奇怪,因为它只是一个案件来处理。但我不希望它是可衡量的。

0

当vector包含一个没有默认构造函数的类的对象时,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()' 
+0

我想这是因为调整大小需要默认构造函数,所以如果您调整大小到大于当前大小,它可以默认构造新元素。 – 2017-10-30 12:54:22