2012-11-17 35 views
1

長話短說是有效的:const_cast映射的鍵值有效嗎?

map<int,int>m; 
    m.insert(make_pair(1, 40)); 
    for(map<int,int>::iterator it = m.begin(); it != m.end(); ++it) 
    { 
     const_cast<int&>(it->first) = 2; 
    } 

它的作品,我也遇到過自己在這個問題,這在現實情況下,地圖是地圖上兩個班,map<classA,classB>和訪問非const的我不得不const_cast<classA&>(it->first).NonConstFunction(),這是我想到的第一個想法,是這樣做還是有什麼更好

+1

我不知道在哪裏具體說,但我相當肯定這是'const'的一個很好的理由。 – chris

+0

主要的第一個應該是它的地圖的關鍵,問題是這些類有數據類型的成員,這些成員應該在某些時候改變,並且這些類的地圖可能是我的解決方案的最佳途徑 –

+0

如果你想要類似鍵然後使用'std :: multimap'。你在做什麼是危險的,因爲整個地圖沒有它的知識就有相同的密鑰! – iammilind

回答

8

這是不允許的。當像這樣就地修改密鑰時,地圖不會「意識到」該值已更改,因此可能需要將該節點移動到其在內部維護的用於存儲數據的樹中的新位置。如果樹不再被排序,樹上的幾乎任何其他操作都可能崩潰並燒燬。

要正確執行此操作,需要獲取鍵/值對的副本,從地圖中刪除舊節點,在地圖外修改副本,然後將修改後的副本插回到地圖中。

+0

我很難理解第一部分,你能否以非技術性的方式解釋它? –

+3

@ViniyoShouta:地圖按順序維護它包含的項目。當您修改密鑰時,它們可能不再按順序排列。這取決於他們是否有序,所以當/如果他們不是,它不會再正常工作。 unordered_map不會更好 - 它存儲基於密鑰哈希值的值,因此當您更新密鑰時,需要重新計算哈希並將其插入表中該哈希的正確位置。 –

+0

噢,我現在明白了,但在主要問題中,請參閱其中存儲一個具有重載操作符==的關鍵值的類==,它在類之間比較的成員保持不變,即使在這種情況下會發生什麼? –