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
取消引用该元素,则无法完成,因此您得到了该断言。
评论后进一步澄清。
- 在调用擦除时,
iter
在 (2,4) 元素处。
- 然后您使用参数 4
调用 erase
erase
查找具有键 4 的元素并找到元素 (4,6) 并将其从容器中移除
- (与第4元素无关,纯属巧合)
我正在通过查看示例和现有练习来练习我的多图,但我现在很困惑。谁能告诉我这里的 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
取消引用该元素,则无法完成,因此您得到了该断言。
评论后进一步澄清。
- 在调用擦除时,
iter
在 (2,4) 元素处。 - 然后您使用参数 4 调用
erase
查找具有键 4 的元素并找到元素 (4,6) 并将其从容器中移除- (与第4元素无关,纯属巧合)
erase