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节.
Mic*_*hne 18
end()
不是地图的交互者.它实际上是"一个接一个结束"的地图.
'iterator'版本需要迭代器来处理地图中的某些内容.
擦除的"关键"版本执行查找并保护自己免受未找到的密钥的影响,迭代器版本假设您不打算破解内容.
归档时间: |
|
查看次数: |
11762 次 |
最近记录: |