map.erase(map.end())?

Ste*_*lly 21 c++ iterator stl map

考虑:

#include <map>

int main()
{
    std::map< int, int > m;
    m[ 0 ] = 0;
    m[ 1 ] = 1;

    m.erase( 0 );  // ok
    m.erase( 2 );  // no-op
    m.erase( m.find( 2 ) );  // boom!
}
Run Code Online (Sandbox Code Playgroud)

(好的,所以标题讨论了擦除end()迭代器,但是find会返回end()以查找不存在的键.)

为什么擦除不存在的键OK,但擦除end()会爆炸.我在标准中没有看到任何明确的提及?

我在VS2005上尝试了这个(在调试配置中抛出异常)和GCC 4.0.1(100%CPU).它是依赖于实现的吗?

谢谢.

小智 32

因为erase(key),标准说删除了所有带有值键的元素.当然可能没有这样的价值观.

For erase(it)(在哪里it是a std::map::iterator),标准表示它所指向的元素被删除 - 不幸的是,如果它end()没有指向一个有效的元素并且你在未定义的行为中离开,就像你end()用于任何其他地图操作.有关详细信息,请参见第23.1.2节.

  • erase(it)相当于erase(it,++ iterator(it)),这有助于我看到erase(it)无效,因为它= map.end().在.end()之后你需要另一个迭代器. (12认同)
  • 为了澄清:erase()有不同的重载,迭代器版本需要一个有效的元素. (3认同)

Mic*_*hne 18

end()不是地图的交互者.它实际上是"一个接一个结束"的地图.

'iterator'版本需要迭代器来处理地图中的某些内容.
擦除的"关键"版本执行查找并保护自己免受未找到的密钥的影响,迭代器版本假设您不打算破解内容.