迭代期间并发修改地图

时间:2018-09-04 22:02:35

标签: c++ iterator erase

我有以下代码:

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"

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

1 个答案:

答案 0 :(得分:2)

您可以简单地这样做:

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

Demo

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