我正在尝试删除地图中的所有条目,其中值== 50表示任何键。
这段代码对我来说很好。
while (itr != mymap.end())
{
if ((*itr).second == 50)
mymap.erase(itr++);
else
itr++;
}
但是这段代码给出了运行时错误。
while (itr != mymap.end())
{
if ((*itr).second == 50)
{
mymap.erase(itr);
itr++
}
else
itr++;
}
我怀疑是不是两个逻辑都一样?为什么在第二种情况下运行时错误?
答案 0 :(得分:2)
不,逻辑不一样。 在第一种情况下,当迭代器是有效的迭代器时,迭代器会在删除元素之前进行后增量。 在第二种情况下,当元素是无效迭代器时,迭代器会在删除元素后进行后增量。
此操作的常用方法如下
while ( itr != mymap.end() )
{
if ( (*itr).second == 50 )
itr = mymap.erase( itr );
else
itr++;
}
根据C ++标准(23.2.4关联容器)
9插入和安置成员不得影响其有效性 迭代器和对容器的引用,以及擦除成员 将仅使迭代器和对已擦除的引用无效 元素强>