Multimap - 想知道 .erase() 函数

Multimap - wondering about .erase() function

我正在通过查看示例和现有练习来练习我的多图,但我现在很困惑。谁能告诉我这里的 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;

到目前为止我知道多重集是(0, 2), (1, 0), (2, 4), (3, 4), (4, 6)。但是,当我尝试在其他可能的迭代器位置打印出对时,只要 myMap.erase(iter->second) 行存在,如果我在那里递增迭代器,它就无法再打印出 (4, 6) 。它给出了一个 map/set 迭代器不可取消引用的错误。

这里究竟发生了什么?究竟得到了什么"erased"?

地图包含 key/value 对的元素。

erase 旨在从容器中删除指定的密钥。但是,通过传递 iter->second,您会将第三个元素的值传递给 erase,即 4.

所以key为4的元素被删除,也就是最后一个元素。如果您随后尝试用另一个 ++iter 取消引用该元素,则无法完成,因此您得到了该断言。


评论后进一步澄清。

  1. 在调用擦除时,iter 在 (2,4) 元素处。
  2. 然后您使用参数 4
  3. 调用 erase
  4. erase 查找具有键 4 的元素并找到元素 (4,6) 并将其从容器中移除
  5. (与第4元素无关,纯属巧合)