在迭代期间同时修改映射

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在迭代期间同时修改映射相关的知识,希望对你有一定的参考价值。

我有以下代码:

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"

我该如何解决这个例外?我想确保列表中已有的元素不在列表中。

答案

你可能只是这样做:

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

Demo

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

以上是关于在迭代期间同时修改映射的主要内容,如果未能解决你的问题,请参考以下文章

List addAll throw error :Unhandled Exception: 迭代期间并发修改:

哪些类似 python deque 的容器在突变期间保留有效的迭代器?

如何在“每次”迭代期间附加列表时保持列表的长度不变

C# 使用IEnumerable,yield 返回结果,同时使用foreach时,在循环内修改变量的值无效

在迭代期间将对象添加到现有列表

如何遍历地图,修改地图但在每次迭代时恢复?