2017-06-06 25 views
-5
std::vector<int> v; 
v.push_back(1); 
int &r0=v[0],*p0=&v[0]; 
v.insert(v.begin(),0); 
for (int i=2; i<1000000; i++) v.push_back(i); 

我插入並添加額外的元素後,整個向量可能會轉移到不同的內存位置?C++引用是否像宏替換一樣工作?

那麼r0和p0會返回什麼?

如果向量已經移動我猜p0會指向垃圾,但參考是否仍然有效(即返回0)?是否類似於宏替代的參考?

+3

宏替代與其他任何東西都完全不同。您的代碼將創建一個懸掛參考 –

+0

矢量本身'v'永遠不會移動。 – molbdnilo

+0

你確定molbdnilo嗎? http://www.cplusplus.com/reference/vector/vector/ states「在內部,矢量使用一個動態分配的數組來存儲它們的元素。這個數組可能需要重新分配,以便在插入新元素時增加大小,這意味着分配一個新的數組並將所有的元素移動到它上面,這在處理時間方面是一個相對昂貴的任務,因此每次向容器添加一個元素時矢量都不會重新分配。 – NoComprende

回答

1

引用不像是宏替換。

任何增加std::vector大小的操作都會使其迭代器的end()無效。如果調整大小也增加了向量的容量(即重新分配底層內存),迭代器也會失效。

這意味着r0p0都可能失效。如果沒有在調整大小前後檢查並比較v.capacity()的結果(並確認容量沒有變化),則不保證r0p0引用或指向載體v的第一個元素。

用於更新矢量大小和容量的策略是實現定義的。考慮到你的代碼插入了一百萬個和一個元素(1000001),很可能容量在某個點上增加了,並且r0p0都是無效的(即,留下了懸掛) - 實際上,很少有std::vector的實現會使用在添加該數量的元素時不需要調整大小的策略。所以,實際上,r0p0都是無效的。

該向量的地址(即&v)不會改變。由vv.capacity(),v.size(),v.data(),v.begin(),v.end()等)管理的數據的特徵將會(可能)改變。

+0

謝謝彼得。我認爲這是在引用我的描述中使用了「別名」這個詞。 – NoComprende

相關問題