C++11 使用迭代器从c++; map-m\u-map; // ... 迭代器it=m_map.begin(); while(it!=m_map.end()) { m_map.erase(it++); }

C++11 使用迭代器从c++; map-m\u-map; // ... 迭代器it=m_map.begin(); while(it!=m_map.end()) { m_map.erase(it++); },c++11,dictionary,iterator,C++11,Dictionary,Iterator,++操作何时发生?是在擦除之前还是之后?什么时候这样做比较安全?我认为没有指定++是在调用擦除之前还是之后执行。尽管如此,即使保证在调用之前对其进行修改,您必须询问的事实表明代码是错误的。有一个更好的、100%安全的替代方案: map<int, int> m_map; // ... map::iterator it = m_map.begin(); while (it != m_map.end()) { m_map.erase(it++); } 将迭代器返回到经过擦除的元素。

++
操作何时发生?是在
擦除之前还是之后?什么时候这样做比较安全?

我认为没有指定
++
是在调用
擦除之前还是之后执行。尽管如此,即使保证在调用之前对其进行修改,您必须询问的事实表明代码是错误的。有一个更好的、100%安全的替代方案:

map<int, int> m_map;
// ...
map::iterator it =  m_map.begin();
while (it != m_map.end())
{
  m_map.erase(it++);
}

将迭代器返回到经过擦除的元素。

。即使
++
发生在调用之后(我认为是这样),它仍然是未定义的行为。增加一个迭代器是没有意义的,它指向一个已经被删除的项。我的规则是,我决不能忽略调用
erase
的返回值,因为返回值可能是我唯一可以访问的定义良好的东西@AaronMcDaid我相信这两个操作(增量和调用)是不确定的顺序;如果增量先发生,没关系,如果调用先发生,就像你说的那样。但是您关于
erase
返回值的说法非常明智。这取决于实现。最好使用[idiom]@BruceAdi Erase remove只适用于序列容器,而不适用于关联容器。当然,最好只是在映射上调用
clear()
while (it != m_map.end())
{
  it = m_map.erase(it);
}