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;
}
}
修改映射后,迭代器将失效。请参阅。(副本)