【问题标题】:Concurrent modification of a map during iteration迭代期间同时修改映射
【发布时间】:2018-09-04 22:02:35
【问题描述】:

我有以下代码:

std::list<std::tuple<int,double>> myList; //assume it is empty
std::map<int,double> myMap; //assume it has values
for (auto m_itr = myMap.begin(); m_itr != myMap.end();){
    myList.push_back(std::make_tuple(m_itr->first,m_itr->second));
    m_itr = myMap.erase(m_itr);
}

但它会引发以下异常:

"list iterators incompatible"

如何解决此异常?我想确保地图中没有元素已经在列表中。

【问题讨论】:

  • 应该是m_itr = myMap.erase(m_itr);myMap.erase(m_itr++);
  • 改造后延迟myMap.clear()怎么样?
  • 提示:erase 返回一些东西。使用它。
  • @Slava 好的,所以我想我应该做 m_itr = myMap.erase(m_itr) 但现在我得到了异常“列表迭代器不兼容

标签: c++ iterator erase


【解决方案1】:

你可以这样做:

std::list<std::tuple<int, double>> myList(myMap.begin(), myMap.end());
myMap.clear();

Demo

否则,您必须使用 erase 的返回值来获取正确的迭代器。

【讨论】:

  • 我提到它不起作用但意识到这是另一个问题并且这个解决方案是正确的。
猜你喜欢
  • 2017-03-04
  • 2010-10-15
  • 2012-12-08
  • 2013-01-15
  • 1970-01-01
  • 2018-10-08
  • 2019-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多