2010-04-29 78 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