有序映射的迭代器有效性

Iterator validity with ordered maps

我有这样的地图定义和后续操作。

map<int,string> m;
m.insert(std::pair<int,string>(1,"A");
m.insert(std::pair<int,string>(2,"B");
m.insert(std::pair<int,string>(3,"C");
m.insert(std::pair<int,string>(4,"D");
auto it = m.find(2);
m.erase(m.find(3));
cout<< it->second;

擦除其他元素后 "it" 是否有效?

是的,会的。执行映射擦除时,只有擦除的迭代器无效。

Will "it" be valid after an erase to some other element ?

是的,std::map::erase只会使对已删除元素的引用和迭代器无效。

References and iterators to the erased elements are invalidated. Other references and iterators are not affected.

注意代码 m.erase(m.find(3)); 有一个潜在的问题,因为 std::map::find 将 return end() 迭代器,如果没有找到,但 end() 迭代器不能与 std::map::erase.

一起使用

The iterator pos must be valid and dereferenceable. Thus the end() iterator (which is valid, but is not dereferencable) cannot be used as a value for pos.