2011-06-12 188 views
0

我有一個std集S. S包含MyType的幾個實例。 這是獲取指向S中MyType實例的最佳方式嗎?獲取std :: set(C++)中的對象的指針

MyType *pointerToMyType = (MyType*)(&*S.find(anotherInstanceOfMyType)); 

上述代碼有效。我只是不確定它是最好的還是最安全的方式。

編輯:我在上面的行之前檢查find到S.end()的結果。

編輯:移除鑄件導致以下編譯時錯誤:

+2

STL集合,還是'std :: set'? – 2011-06-12 22:21:25

+1

因爲存儲在std :: set中的對象是不可變的,所以你不能合法地獲得一個'MyType *'。 – 2011-06-12 22:32:52

+1

@詹姆斯麥克奈利斯:的確。其他答案都沒有注意到這一點。 – Puppy 2011-06-12 22:38:11

回答

3

您應該而不是採取可變引用或指向set中的元素的指針。如果你改變它的屬性,那麼你將使容器的不變量失效,導致未定義的行爲。那個編譯時錯誤是有原因的,而且,你的代碼顯示了一個很好的例子,說明爲什麼C風格的轉換是壞的 - 因爲他們可以拋出const,而其他的回答者都沒有注意到,而如果你已經被迫使用const_cast,每個人都會注意到這是多麼糟糕。

但是,如果您採取有效的const MyType*,那麼演員陣容將是多餘的,&*iterator是一個完美的解決方案。

+0

是一個「可變的指針或對矢量元素的引用」好嗎?我的set/vector/whatever包含了自己擁有集合的對象......並且我想添加到這些集合中。 – MrDatabase 2011-06-12 23:00:35

+1

在一個向量中,是的,沒關係。基本上,你應該相信編譯器。刪除演員;如果編譯器允許你使用一個非const指針,那麼它是可以的。 – 2011-06-12 23:49:47

+0

隨時回答這個問題,但是用你的答案作爲對其他人的答案缺陷粗魯的平臺,似乎有點偏離。如果你想指出其他答案的不足之處,可以下載和評論。 – 2011-06-13 09:03:36

1

兩件事 「從 '常量的MyType *' 到 '的MyType *' 轉換無效」,

  1. static_cast
  2. 在抓取指針之前,您應該確實檢查對象是否存在於集合中。

至於方法,如果你充實你正在嘗試做的,有可能是一個更好的辦法...

編輯:哎呀,在static_cast是多餘的太...習慣,每當我看到一個C樣式轉換...

1

你有什麼是好的,雖然:

  • 你或許應該檢查迭代器解引用之前有效。
  • 無需演員。
1

假設你知道元素存在...

Is this the best way to get a pointer to an instance of MyType in S?

號你不需要投。如果你這樣做,它不應該是一個C演員,它應該是一個const_cast