2016-01-17 27 views
1

我知道C++ STL向量在推回超過容量時重新分配了兩次分配的空間。我的問題是,如果我有一個向量的引用,它會在推回後保持有效嗎?推回後引用矢量重定位嗎?如果是,如何?

一個例子如下:

void displayVector(vector<int>& p) 
{ 
    for(auto i:p) 
     cout<<i<<" "; 
    cout<<endl; 
    cout<<"capacity = "<<p.capacity()<<endl<<endl; 
} 

int main() 
{ 
    vector<int> x(1); 
    vector<int>& y=x; 

    cout<<"x"<<endl; 
    displayVector(x); 

    cout<<"y"<<endl; 
    displayVector(y); 

    for(int i=0;i<100;i++) 
     x.push_back(10); // re- allocation takes place many times 

    cout<<"x"<<endl; 
    displayVector(x); 

    cout<<"y"<<endl; 
    displayVector(y); 
} 

結果,我從上面的程序得到了顯示,y保持爲即使經過多次重新分配一個參考x有效。

所以我的問題是:

1)將它總是發生,或者這可能在某些情況下,打破?

2)如果引用在它仍然有效的情況下仍然有效,即在重新分配後仍然保持引用有效。

+1

對矢量的引用與它所保存的數據不同。所以完全沒問題。 –

+0

發生在對象引用上的任何事情都發生在它引用的對象上。 – juanchopanza

回答

2

y參考x將始終保持相同的(合法的),不管什麼x內部發生。因爲當x由於pushback s超過capacity而必須重新分配內存時,發生這種情況時,指向分配的內存的指針必須隨着更多的順序(因此位於不同的地方)內存需要而改變。