2013-04-01 170 views
1

所以我有一個multimap,其中鍵是一個結構,而值是另一個結構。從multimap中完全刪除元素(C++)

multimap<struct, struct> multimap1; 

multimap1包含(格式爲keyvalue

1: Random Value 1 
2: Random Value 2 
3: Random Value 3 
4: Random Value 4 

我試圖抹掉值和從multimap中一個關鍵。假設我想刪除multimap的第二個條目。結果應該是這樣的:

1: Random Value 1 
3: Random Value 3 
4: Random Value 4 

我有一個指向第二迭代器,所以當我用multimap1.erase(it)抹掉它,它應該刪除第二項(至少我認爲它應該)。我一直在閱讀刪除條目和multimaps,似乎只有從multimap中刪除的值,而不是關鍵。因此,如果刪除與一個迭代器指向第二第二項,它會做到這一點(糾正我,如果我錯了):

1: Random Value 1 
2: 
3: Random Value 3 
4: Random Value 4 

是否有一種方式來獲得的中間值結果呢?

編輯:所以我顯然是錯的。如果你擦除,你會得到中間結果。我想弄清楚爲什麼我沒有正確擦除,因爲當我調用擦除時,我的代碼出現了段錯誤。如果我打電話給it->first,它會返回我想要移除的元素的鍵。如果我撥打it->second,它將返回該密鑰的值。所以如果我打電話multimap.erase(it),它應該刪除整個事情,對嗎?

編輯2:在我的代碼中,我打印出it->firstit->second以確保指針指向正確的元素並且它是。當我打電話給multimap.erase(it)時,我停止了循環並打印出multimap中的其餘元素。它正確打印的第一個元素,但隨後的第二元件被印刷像這樣(由編譯器輸出):

GEWolfC?`6??2?x3??2??2?x [email protected]?????BUYA????BadWolfCorp1????AMstyKrq?4?X3??(4??3?  
X3PlanetExpress1GEqp7?L???5?d?5?x5??5?d2q7?7?X3??(4??3?X3?? 

所以,很顯然,它是不正確刪除。我在linux上運行g ++ 4.7。

編輯3:抱歉做了這麼多的編輯,我想保留原來的問題,以便將來可以引用它。只是爲了試驗,我打電話給multimap.erase(it->first),那個工作正常。有人可以向我解釋爲什麼這個工作以及這裏發生了什麼?

+0

你試過嗎? 「 –

+0

」似乎只有這個值是從multimap中刪除的,而不是密鑰。「這不是真的,我很好奇你是怎麼想的。 – jrok

+0

那麼,我有循環,將使用迭代器刪除某些元素,但我停止了短循環。然後我打印剩餘的多重地圖並且打印不正確。 – OGH

回答

1

erase會根據需要刪除整個條目(「鍵值」對)。

有時,在討論地圖類型時會出現混淆,因爲庫規範將value_type定義爲「鍵值」對,而不僅僅是「值」(定義爲mapped_type);所以「價值」一詞可以互換使用來表示其中的一種。