2015-04-01 31 views
1

是否有性能的原因,爲什麼一個矢量將被初始化爲大小?爲什麼設置一個矢量的大小

例如vector<myClass> v(10);而不是vector<myClass> v和push_back根據需要?

+0

每次推回後,打印'capacity()'。每當它發生變化時,都會發生動態分配。現在嘗試先調用'reserve'。 – 2015-04-01 00:32:52

回答

2

如果push_back()增加矢量超過其當前capacity(),它將重新分配其數組,這是不高效的。因此,如果你確切地告訴載體有多少元素要存儲,那麼你不需要重新分配載體的代價,特別是如果載體必須改變存儲器中的位置(因爲它確實不適合它的地方),因此它自己複製(額外費用!)。

Reallocation of a vector.

Resize.


但是你要相信我嗎?也許。您應該但相信事實:

測試代碼

#include <vector> 
#include <iostream> 
#include <ctime> 
#include <ratio> 
#include <chrono> 

using namespace std; 

int main() { 
    const int N = 1000000; 

    using namespace std::chrono; 
    { 

    // push_back only 

    high_resolution_clock::time_point t1 = high_resolution_clock::now(); 
    vector<int> v1; 
    for(int i = 0; i < N; ++i) 
    v1.push_back(i); 
    high_resolution_clock::time_point t2 = high_resolution_clock::now(); 

    duration<double> time_span = duration_cast<duration<double>>(t2 - t1); 

    std::cout << "It took me " << time_span.count() << " seconds."; 
    std::cout << std::endl; 
    } 

    { 
    // set size and use operator [] 

    high_resolution_clock::time_point t1 = high_resolution_clock::now(); 
    vector<int> v2(N); 
    for(int i = 0; i < N; ++i) 
    v2[i] = i; 
    high_resolution_clock::time_point t2 = high_resolution_clock::now(); 

    duration<double> time_span = duration_cast<duration<double>>(t2 - t1); 

    std::cout << "It took me " << time_span.count() << " seconds."; 
    std::cout << std::endl; 
    } 
    return 0; 
} 

輸出

It took me 0.0170491 seconds. 
It took me 0.00236058 seconds. 

正如你所看到的,實驗結果表明,通過設置向量的大小,我們都快一個數量級。

我的源代碼爲time measurements

+0

你能澄清你的意思嗎?太大了。如果我連續push_back(s),矢量認爲哪個點太大? – 2015-04-01 00:33:26

+2

當新的size()會超過當前的capacity()時,它會重新分配內部數組。你可以使用'reserve()'設置'capacity()'和'resize()'來設置'size()'。 – 2015-04-01 00:33:55

+0

看我的編輯。由於太大,我的意思是比當時的矢量可以存儲的大。究竟是什麼@RemyLebeau說! – gsamaras 2015-04-01 00:34:05

3

vector<myClass> v(10)預先分配一次內部數組,然後用10個默認構造的myClass對象自動填充內部數組。

vector<myClass> v不預先分配數組,但您可以使用reserve()resize()

push_back()將在每次新的size()將超過當前的capacity()時重新分配並複製內部陣列。