删除STL Map中匹配值的所有条目
Delete all entries in STL Map which matches value
我正在尝试删除映射中任何键的值 == 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++;
}
我的疑问是这两个逻辑不是一样的吗?为什么在第二种情况下 运行 时间错误?
不对,逻辑不一样。
在第一种情况下,当迭代器是有效迭代器时,迭代器在擦除元素之前进行后递增。
在第二种情况下,当迭代器是无效迭代器时,迭代器在擦除元素后后递增。
此操作的常用方法如下
while ( itr != mymap.end() )
{
if ( (*itr).second == 50 )
itr = mymap.erase( itr );
else
itr++;
}
根据 C++ 标准(23.2.4 关联容器)
9 The insert and emplace members shall not affect the validity of
iterators and references to the container, and the erase members
shall invalidate only iterators and references to the erased
elements.
我正在尝试删除映射中任何键的值 == 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++;
}
我的疑问是这两个逻辑不是一样的吗?为什么在第二种情况下 运行 时间错误?
不对,逻辑不一样。 在第一种情况下,当迭代器是有效迭代器时,迭代器在擦除元素之前进行后递增。 在第二种情况下,当迭代器是无效迭代器时,迭代器在擦除元素后后递增。
此操作的常用方法如下
while ( itr != mymap.end() )
{
if ( (*itr).second == 50 )
itr = mymap.erase( itr );
else
itr++;
}
根据 C++ 标准(23.2.4 关联容器)
9 The insert and emplace members shall not affect the validity of iterators and references to the container, and the erase members shall invalidate only iterators and references to the erased elements.