2012-12-22 49 views
3

答案here說:載體向量如何工作?

從n2798(的的C++ 0x草案): 向量的元素被存儲連續的,這意味着如果v是 一個向量,其中T是某種類型的比布爾其他,那麼它遵守 身份& v [n] == & v [0] + n對於所有的0 < = n < v.size()。

該程序的工作原理:

#include <iostream> 
#include <vector> 
#include <iterator> 
using namespace std; 

int main(){ 
    int k; 
    cin >> k; cout << endl << "k = " << k << endl; 
    ostream_iterator<int> oi(cout, " "); 
    vector<vector<int> > vpi; 
    while(k--) 
    { 
    vpi.push_back(vector<int>(istream_iterator<int>(cin), istream_iterator<int>())); 
    cin.clear(); 
    cout<<"k = "<< k <<endl; 
    copy(vpi[vpi.size()-1].begin(), vpi[vpi.size()-1].end(), oi); 
    cout<<endl; 
    } 
} 

如何能矢量存儲載體連續,當向量的元素必須具有相等的尺寸和要被存儲在預先不知道矢量的大小?

我很抱歉如果之前詢問過,我找不到它,如果是這種情況,請給我一個鏈接。

+0

誰投了-1請告訴我爲什麼。 –

+0

[This](http://stackoverflow.com/questions/13341264/vector-elements-do-not-appear-to-be-stored-contigously)問題源於類似的誤解。 –

回答

3

A std::vector是一個小的固定大小的對象。通常的實現包括三個指針或一個指針和幾個整數大小(用於當前大小和分配的容量)。向量的內容不存儲在向量對象本身中,而是存儲在使用向量的分配器(默認爲標準堆分配器)分配的內存中。

所以矢量矢量是一個小對象,通常是三個指針的大小。它內部的向量是堆中某處連續內存中的小對象。這些內部向量的內容在堆中的其他地方。

+0

** C++ **中沒有_dynamic-size objects_,它們是嗎? –

+0

@ K-ballo並非如此。每個對象的大小在編譯時都是已知的。但是,對象可以保存指向堆中運行時分配的對象的指針,實際上是* kind-of-dynamic-size *,但仍具有固定的'sizeof(T)'。 – luiscubal

+0

沒錯。現在請告訴我,我應該怎麼知道這一點? _cplusplus.com_,_cppreference.com_,閱讀代碼?你怎麼會知道這事?你還問_stackoverflow.com_? :-) –

0

矢量可以很容易地連續存儲,因爲它們的元素不在自身內部,而是在免費商店的某些內存中。 sizeof指定的對象的大小爲編譯時常量表達式,這些是連續存儲的位。

+0

通過「不在自己」你可能意味着他們通過指針表示? –

+1

@DoruGeorgescu:是的,內存來自堆存儲,指針,動態分配。否則,他們將如何工作? –

+0

否則他們無法工作,但這是寫在哪裏?對象被直接記住,可能只有通過指針重新包含對象。關於這個在cplusplus.com上沒有任何關於。 –