#include <map>
#include <iostream>
int main()
{
std::multimap <int, int> map;
// insert the values in multimap
map.insert(std::make_pair(1, 10));
map.insert(std::make_pair(2, 20));
map.insert(std::make_pair(2, 30));
map.insert(std::make_pair(2, 40));
map.insert(std::make_pair(3, 50));
map.insert(std::make_pair(4, 60));
map.insert(std::make_pair(4, 70));
int key = 2;
bool fo = false;
for (auto itr = map.begin(); itr != map.end(); itr++)
{
if (itr -> first == key)
{
if(fo)
{
map.erase(itr);
}
fo = true;
}
}
for (auto itr = map.begin(); itr != map.end(); itr++)
{
std::cout << itr -> first << " "
<< itr -> second << std::endl;
}
return 0;
}
map.erase(itr);
使最后一个for循环输出为空。其思想是最后一个for循环将输出不带2的map,但由于bool fo
的原因,前2除外。如何修复此问题以获得上述所需的输出?
2条答案
按热度按时间dced5bon1#
itr
迭代器现在是无效的。当你从容器中erase()
一些东西时,擦除值的迭代器总是无效的,并且根据容器的不同,其他迭代器可能无效也可能不无效。但是这里的问题是这个特定的itr
。它现在是一个燃烧的残骸。...... aaa,然后立即递增无效的迭代器。
如果查看
erase()
文档,您会发现erase()
返回容器中***next***值的迭代器,itr++
也会返回该迭代器。迭代器的增量从
for
循环本身中移除,并在这里完成,作为对erase()
的警告。pb3skfrl2#
你不需要在整个map中循环来查找具有给定键的元素,通过键快速查找元素是map的关键所在,你可能需要这样的代码:
这将擦除除除具有给定键的第一个元素以外的所有元素。