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)?是否類似於宏替代的參考?
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)?是否類似於宏替代的參考?
引用不像是宏替換。
任何增加std::vector
大小的操作都會使其迭代器的end()
無效。如果調整大小也增加了向量的容量(即重新分配底層內存),迭代器也會失效。
這意味着r0
和p0
都可能失效。如果沒有在調整大小前後檢查並比較v.capacity()
的結果(並確認容量沒有變化),則不保證r0
和p0
引用或指向載體v
的第一個元素。
用於更新矢量大小和容量的策略是實現定義的。考慮到你的代碼插入了一百萬個和一個元素(1000001
),很可能容量在某個點上增加了,並且r0
和p0
都是無效的(即,留下了懸掛) - 實際上,很少有std::vector
的實現會使用在添加該數量的元素時不需要調整大小的策略。所以,實際上,r0
和p0
都是無效的。
該向量的地址(即&v
)不會改變。由v
(v.capacity()
,v.size()
,v.data()
,v.begin()
,v.end()
等)管理的數據的特徵將會(可能)改變。
謝謝彼得。我認爲這是在引用我的描述中使用了「別名」這個詞。 – NoComprende
宏替代與其他任何東西都完全不同。您的代碼將創建一個懸掛參考 –
矢量本身'v'永遠不會移動。 – molbdnilo
你確定molbdnilo嗎? http://www.cplusplus.com/reference/vector/vector/ states「在內部,矢量使用一個動態分配的數組來存儲它們的元素。這個數組可能需要重新分配,以便在插入新元素時增加大小,這意味着分配一個新的數組並將所有的元素移動到它上面,這在處理時間方面是一個相對昂貴的任務,因此每次向容器添加一個元素時矢量都不會重新分配。 – NoComprende