C++ 当我从映射中删除条目时,`map::iterator`会发生什么情况?

C++ 当我从映射中删除条目时,`map::iterator`会发生什么情况?,c++,map,iterator,C++,Map,Iterator,可能重复: 我有一个对象的映射,我想遍历它并删除一些条目 typedef std::map<A,B> MapT; MapT m; MapT::iterator it; for(it = m.begin(); it != m.end(); it++ ) { if( condition ) m.erase(it); } typedef std::map MapT; MapT-m; 迭代器; for(it=m.begin();it!=m.end();it++){ 如果(条件

可能重复:

我有一个对象的映射,我想遍历它并删除一些条目

typedef std::map<A,B> MapT;
MapT m;
MapT::iterator it;

for(it = m.begin(); it != m.end(); it++ ) {
    if( condition ) m.erase(it);
}
typedef std::map MapT;
MapT-m;
迭代器;
for(it=m.begin();it!=m.end();it++){
如果(条件)m.擦除(它);
}

我可以这样做吗?

对于
std::map
迭代器和对已擦除元素的引用无效[23.1.2/8]。您的代码在迭代器失效后使用它,这将导致未定义的行为。为了避免这种未定义的行为,需要在调用
erase()
之前增加迭代器

您需要使用:

for(it = m.begin(); it != m.end(); ) {
    if( condition )
        m.erase(it++);
    else
        ++it;
}

请注意,此处的
it++
递增
it
,以便它引用下一个元素,但生成其原始值的副本。因此,
不引用调用
erase()
时删除的元素。

假设
MapT
std::map
,则迭代器在删除时将失效。执行此操作的正确方法(
在循环中擦除
)是缓存迭代器并在擦除之前递增:

MapT m;
MapT::iterator it;

for(it = m.begin(); it != m.end();)
{
    if(condition)
    {
       MapT::iterator tmp = it++;
       m.erase(tmp);
    }
    else
    {
       ++it;
    } 
}

修改映射后,迭代器将失效。请参阅。(副本)