2016-11-17 82 views
0

我正在通過查看示例和現有練習來練習我的多圖,現在我很困惑。任何人都可以通過myMap.erase(iter-> second)在這裏告訴我什麼被擦除了嗎?Multimap - 關於.erase()函數的想法

multimap<int, int> myMap; 
    for (int i = 0; i < 3; i += 2) 
     myMap.insert(make_pair(i + 1, i * 2)); 
    for (int i = 0; i < 5; i += 2) 
     myMap.insert(make_pair(i, i + 2)); 

multimap<int, int>::iterator iter = myMap.begin(); 
    ++iter; 
    ++iter; 
    myMap.erase(iter->second); 
    ++iter; 

    cout << iter->first << iter->second << endl; 

到目前爲止我知道多集是(0,2),(1,0),(2,4),(3,4),(4,6)。但是,當我試圖在其他可能的迭代器位置打印對時,如果我只是在存在myMap.erase(iter->second)行時增加迭代器,則不能再打印出來(4,6)。它給出了一個map/set迭代器不可忽略的錯誤。

究竟發生了什麼?實際上「擦除」了什麼?

回答

2

該映射包含鍵/值對的元素。

erase旨在從容器中刪除指定的密鑰。但是,通過傳遞iter->second,您將第三個元素的值傳遞給erase,即4.

因此,刪除最後一個元素的鍵爲4的元素。如果你嘗試用另一個++iter解除引用該元素,那麼它不能完成,所以你得到了這個斷言。


評論後的進一步澄清。

  1. 在調用擦除時,iter位於(2,4)元素處。
  2. 你再調用erase與參數4
  3. erase尋找一個元素與關鍵4,發現元素(4,6),並刪除從容器
  4. (無關的第四元素,這是巧合)
+0

所以它從字面上需要4(3,4),然後擦除「4」元素aka(4,6)?如果迭代器開啓(3,2),當它擦除iter-> second時,它會擦除​​第二個元素(1,0)? – BaloneyOs

+0

不,這是錯誤的,請參閱我的編輯。 – acraig5075

+0

啊,所以關鍵是這一對中的第一個元素。我嘗試擦除其他東西,並與此匹配。謝謝您的幫助! – BaloneyOs