我很好奇以下代码背后的基本原理。对于给定的地图,我可以使用以下代码删除一个范围,但不包括end()
(显然):
map<string, int> myMap;
myMap["one"] = 1;
myMap["two"] = 2;
myMap["three"] = 3;
map<string, int>::iterator it = myMap.find("two");
myMap.erase( it, myMap.end() );
这将使用范围擦除最后两项。但是,如果我使用擦除的单个迭代器版本,我有一半希望通过myMap.end()
不会导致任何操作,因为迭代器显然位于集合的末尾。这与明显会导致未定义行为的损坏或无效迭代器不同。
但是,当我这样做时:
myMap.erase( myMap.end() );
我只是得到一个分段错误。我不会认为 map 很难检查迭代器是否相等end()
并且在这种情况下不采取行动。我错过了一些微妙的原因吗?我注意到即使这样也有效:
myMap.erase( myMap.end(), myMap.end() );
(即什么都不做)
我问的原因是我有一些代码接收到集合的有效迭代器(但可能是end()
),我想简单地将它传递给擦除,而不是像这样首先检查:
if ( it != myMap.end() )
myMap.erase( it );
这对我来说似乎有点笨拙。另一种方法是重新编码,这样我就可以使用按键类型擦除重载,但如果我能提供帮助,我宁愿不要重写太多。