我正在尝试使用存储在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;
}
答案 0 :(得分:3)
在使用范围循环进行迭代时,无法从std::map
或std::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