我们知道在移出元素时,指向当前的迭代器会失效,如果要移出多个元素时,可以使用这种方法。
我们看下面这段代码:
typedef std::map<std::string,float> StringFloatMap;
StringFloatMap coll;
StringFloatMap::iterator pos;
for(pos=coll.begin();pos!=coll.end();++pos)
{
if(pos->second==value)
{
coll.erase(pos);//runtime error
}
}
对pos所指的元素实施erase(),会使pos不再成为一个有效的coll迭代器。如果此后未对pos重新设值就径行使用pos,事实上只要一个++pos操作就会导致未定义行为。
我们可以用这样的方法来进行改进。
typedef std::map<std::string,float> StringFloatMap;
StringFloatMap coll;
StringFloatMap::iterator pos;
for(pos=coll.begin();pos!=coll.end();)
{
if(pos->second==value)
coll.erase(pos++);
else
++pos;
}
pos++会将pos移向下一元素,但返回其原始值的一个副本。因此当erase()调用,pos已经不再指向那个即将被移除的元素了。