c ++ unordered_map迭代器在擦除元素之后停止

时间:2016-12-08 22:02:34

标签: c++ hashmap unordered-map

我正在尝试使用存储在hashmap中的多项式来计算多项式导数的函数,但我不确定为什么迭代器在我通过迭代擦除元素时停止。代码如下,如果map.erase(i.first);到位,迭代器将停止

哈希键包含指数度,桶包含已分配的系数。输入多项式为3x ^ 6 + 4x ^ 4 + 6x ^ 2 + 2

#include <iostream>
#include <unordered_map>
using namespace std;

unordered_map <int,int> derivative (unordered_map<int, int>& map) {
unordered_map <int, int> answer;
    map.erase(0);   // drop the constant in the polynomial

    for (auto i: map) {
        answer [i.first-1] = i.first * i.second;    //take the derivative
       // map.erase(i.first);     // erase the element after taking the derivative

    }
    return answer;
}

int main() {
    unordered_map <int,int> map = {{6,3},{4,4},{2,6},{0,2}};

    unordered_map<int,int> result = derivative(map);

    for (auto i: result)
        cout << i.second << "X^" << i.first << endl;

    return 0;
}

2 个答案:

答案 0 :(得分:3)

在使用范围循环进行迭代时,无法从std::mapstd::unordered_map删除当前元素,而是使用迭代器:

for( auto it = map.begin(); it != map.end(); ) {
     if( condition ) map.erase( it++ );
     else ++it;
}

在您的特定情况下,它可以简化为:

for (auto it = map.begin(); it != map.end; ) {
    answer[it->first-1] = it->first * it->second;    //take the derivative
    map.erase(it++);
}

答案 1 :(得分:1)

以下

for(auto i : map) {
    answer[i.first - 1] = i.first * i.second;    //take the derivative
    map.erase(i.first);     // erase the element after taking the derivative
}

正在迭代元素。 <{1}}的{​​{3}}元素在迭代时会得到未定义的行为。

如果您使用的是兼容c ++ 14的编译器,则可以显式使用迭代器并使用map.erase(i.first);的返回值进行更新。这样通过容器元素If you erase one

所以你可以这样做:

erase