這是靈感來自Effective C#第一版中的一個項目,警告關於凌駕GetHashCode()
。當一個`key/value`插入到`std :: map`中時,它是否創建了它自己的對象副本?
對不起,我沒有支持的代碼。順便說一下,這不是一項家庭作業,我只是不熟悉C++/STL
,並且找不到有關實施的信息。
想我創造我自己的類被點名的人擁有3個公共可變的字符串字段:
- 名字,
- 中間初始
- 姓
它還提供了一個更小比操作人員先把姓名與先姓,然後是中間姓名,然後是姓氏進行比較 - 這就是全部。
我創建一個從人到int(比如年齡)的地圖,並用大約20個鍵/值對填充它。我還將指針存儲在數組中。然後我改變第五個指針指向的對象的名字,然後嘗試使用這個修改過的鍵來查找對應的年齡(記住對象是可變的並且全開)。
爲什麼會發生這種情況?
A)因爲std::map
使用的密鑰沒有改變(被複制),我改變了我自己的副本,現在我的密鑰沒有找到。但這怎麼可能呢?我沒有提供我自己的拷貝構造函數。編譯器可能創建了一個默認的?
B)std::map
集合實際上是一棵紅黑樹,我碰巧有一個直接指向某個鍵的指針。當我更改密鑰時,我直接在樹的節點中更改它。現在很可能是我的節點放置不正確,並且不會使用適當的樹搜索算法找到它。我應該刪除節點,然後修改它們的關鍵字,然後重新插入它。如果是這樣的話,那麼我懷疑STL
集合通常是相當危險的,會導致noobs犯很多錯誤。
C)還有別的嗎?
我將不勝感激您的見解。
你在密鑰中使用了什麼特定的數據類型?你說的字符串,但要清楚,他們是std ::字符串?如果是這樣,A是正確的 - STL容器將複製鍵和值中的所有數據。 – Joe 2011-04-16 15:12:21