当我从地图中删除条目时,`map :: iterator`会发生什么?

kra*_*mir 3 c++ iterator map

可能重复:
如何过滤std :: map中的项目?
如果在从头到尾迭代时调用map元素上的erase()会发生什么?

我有对象的地图,我想迭代它并删除一些条目.

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

for(it = m.begin(); it != m.end(); it++ ) {
    if( condition ) m.erase(it);
}
Run Code Online (Sandbox Code Playgroud)

我可以这样做吗?

Alo*_*ave 8

std::map迭代器的情况下,对擦除元素的引用无效[23.1.2/8].您的代码在失效使用迭代器,这会导致未定义的行为.为了避免这种未定义的行为,迭代器需要在调用中失效之前递增erase().

你需要使用:

for(it = m.begin(); it != m.end(); ) {
    if( condition )
        m.erase(it++);
    else
        ++it;
}
Run Code Online (Sandbox Code Playgroud)

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


归档时间:

查看次数:

445 次

最近记录:

13 年,7 月 前