2016-01-17 26 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而必须重新分配内存时,发生这种情况时,指向分配的内存的指针必须随着更多的顺序(因此位于不同的地方)内存需要而改变。