簡體   English   中英

std :: vector和指針的可預測性

[英]std::vector and pointer predictability

當將push_back()項目推入std::vector並通過back()引用保留指向矢量中對象的指針時-您可以保證(假設不發生刪除)矢量中對象的地址保持不變?

看來我的向量改變了我使用的對象的指針,這樣,如果我將10個項目推入其中,並通過記住每個push_back之后的back()引用來保留指向這10個項目的指針。

如果向量是存儲對象而不是對象的指針,那么這些對象的地址在推送更多項目時會不斷變化嗎?

不, std::vector不是穩定的容器,即,指針和迭代器可能會因調整Vector的大小(或更佳地是通過相應的重新分配)而失效。 如果要避免這種行為,請改用boost::stable_vectorstd::liststd::deque (我希望使用后者)。 或者,更容易地,您可以僅按索引存儲位置。

有關更多信息,請在此處也考慮此問題的答案。

導致向量自行調整大小的任何方法都將使所有迭代器,指針和對其中包含的元素的引用無效。 可以通過保留內存或使用boost::stable_vector來避免這種情況。

23.3.6.5/1:

備注:如果新大小大於舊容量,則導致重新分配。 如果沒有發生重新分配,則插入點之前的所有迭代器和引用均保持有效。

不能保證。 如果push_back足夠多的項目超過向量后備存儲緩沖區的大小,則會創建一個新緩沖區,所有內容都將復制到新位置,而舊緩沖區將被刪除。 屆時,舊的指針(以及迭代器!)將無效。

如果您確切知道將需要多少最大空間,則可以在創建向量時將向量緩沖區的大小設置為該大小,以避免重新分配。 但是,我更喜歡存儲對向量元素的“引用”作為對向量的引用以及對向量的size_t索引,而不是使用指針。 它不一定比指針慢(取決於CPU類型),但是即使它變慢也不會慢很多,我認為值得一提的是,無論向量如何在指針中使用將來或重新分配,它仍將引用適當的元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM