从基于范围内的地图中擦除是否安全?

5 c++ foreach map range

我经常使用这种语法来循环一个std::map

for( const auto& my_pair: my_map )
Run Code Online (Sandbox Code Playgroud)

我可以my_map.erase( my_pair.first );安全地打电话吗?

Snp*_*nps 6

不,这是不是安全的。

my_map.erase( my_pair.first );
Run Code Online (Sandbox Code Playgroud)

在这里,您使用erase键值进行调用,这意味着您将删除具有该键值的所有元素。

当从 a 中擦除元素时,std::map这适用:

对被擦除元素的引用和迭代器无效。其他引用和迭代器不受影响。*

* http://en.cppreference.com/w/cpp/container/map/erase

因此,增加当前迭代器是不安全的,因为它可能已经失效。

  • @Cincinnatus 基于范围的 for 循环使用一个内部迭代器,该迭代器在每次迭代中都会递增。请参阅此处:http://en.cppreference.com/w/cpp/language/range-for (2认同)