【问题标题】:Using iterator for removing items from map in c++在 C++ 中使用迭代器从地图中删除项目
【发布时间】:2015-04-01 11:27:32
【问题描述】:
map<int, int> m_map;
// ...
map::iterator it =  m_map.begin();
while (it != m_map.end())
{
  m_map.erase(it++);
}

++ 操作何时发生?是在erase 之前还是之后?什么时候这样做是安全的?

【问题讨论】:

标签: c++11 dictionary iterator


【解决方案1】:

我认为没有指定 ++ 是在调用 erase 之前还是之后发生。尽管如此,即使保证在调用之前执行,您不得不询问的事实表明代码很糟糕。有一个更好的、100% 安全的替代方案:

while (it != m_map.end())
{
  it = m_map.erase(it);
}

erase 返回一个迭代器,指向已删除元素之后的元素。

【讨论】:

  • 我会走得更远。即使++ 发生在通话之后(我认为确实如此),它仍然是未定义的行为。增加一个指向已经被擦除的项目的迭代器是没有意义的。我的规则是,我永远不应该忽略调用 erase 的返回值,因为返回值可能是我可以访问的唯一明确定义的东西!
  • @AaronMcDaid 我相信这两个操作(增量和调用)是不确定的;如果增量先发生,没关系,如果调用先发生,如你所说,它是UB。但是您关于erase 的返回值的话是非常明智的。
猜你喜欢
  • 2013-10-05
  • 2010-12-01
  • 2013-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 2018-07-24
  • 1970-01-01
相关资源
最近更新 更多