2011-07-14 102 views
1

如何在std :: vector中引用特定元素?常量引用std :: vector

簡單的方法應該是將其存儲爲元素的索引(我正在使用size_t變量)。

我遇到的問題是在當前插入元素的可能性,使存儲的值不正確。

+3

也許'std :: vector'不是您需要的正確容器。你想做什麼? –

+0

@Fred Larson @templatetypedef我不想指出元素本身,我想指出它的位置。我創建的是一個在多邊形中使用布爾操作的算法,我需要找到兩個多邊形之間的交點,並知道一個在另一個多邊形中的相同位置,所以我可以從一個多邊形跳到另一個多邊形。我想到std :: list,但我不知道它是否允許我做這樣的事情。 – Wanderson

回答

1

唯一可靠的解決方案是讓你的矢量是一個指針矢量,只記住你的指針。

否則,你不能保持一個引用,因爲,正如你所提到的,向量可能會移動元素。

4

通過指針,引用或索引來跟蹤vector中的單個元素的方法並不是很好。特別是:

  1. 如果你插入一個新元素到vector,它可能會導致在發生內部重新分配到無效的vector的元素的所有未完成的引用。插入可以通過調用insert,reserve,push_backassign(可能還有其他幾個)來實現。這可能會導致引用引用無效的對象,如果使用該引用,則會導致未定義的行爲。

  2. 如果您從vector中刪除元素,則引用可能不再指向同一元素。訪問參考可能會導致您引用錯誤的對象。

如果你真的必須持有一個vector一個元素的引用,其中一個方案是有vector店(智能)對象的指針,而不是對象本身。這樣,您可以在其他地方存儲該指針的副本,而不管vector中發生了什麼,指針應該仍然有效。這實際上是軟件工程的基本定理 - 增加另一層間接尋址可以解決大多數問題。

0

使用包含自動指針的向量,即如果您使用C++ 0x,則使用std::vector<std::unique_ptr<YOUR_ELEMENT_TYPE>>