Multimap -想知道.erase()函数

Multimap - wondering about .erase() function

本文关键字:函数 erase 想知道 Multimap      更新时间:2023-10-16

我正在通过查看示例和现有练习来练习我的multimaps,我现在很困惑。谁能告诉我这里被myMap.erase(iter->second)擦除的是什么?

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;
到目前为止,我知道multiset是(0,2),(1,0),(2,4),(3,4),(4,6)。然而,当我试图在其他可能的迭代器位置打印成对时,如果我在那里增加迭代器,只要myMap.erase(iter->second)行存在,它就不能再打印(4,6)。给出map/set迭代器不可解引用错误。

这里到底发生了什么?到底是什么被"抹去"了?

映射包含键/值对的元素。

erase表示从容器中擦除指定的键。然而,通过传递iter->second,您将第三个元素的值传递给erase,即4。

键值为4的元素被删除,也就是最后一个元素。如果您然后尝试用另一个++iter解引用该元素,则无法完成,因此您得到该断言。


评论后进一步澄清。

  1. 调用erase时,iter位于(2,4)元素。
  2. 然后使用参数4调用erase
  3. erase查找键为4的元素,找到元素(4,6)并从容器
  4. 中删除该元素
  5. (与第4元素无关,这是巧合)