【问题标题】:C++ Map iterator stucks in infinite for loopC ++ Map迭代器陷入无限循环
【发布时间】:2020-04-22 13:29:26
【问题描述】:

我正在使用for loopC++ 中迭代map,但它陷入了无限循环。我已经搜索过其他类似的问题,最接近的问题是this question,但对该问题的回答并未回答我的查询,因为在该问题中作者正在对地图对象进行更改,但我没有对地图进行任何更改for loop 期间的对象。

我的代码如下(我尝试注释不同的行并发现无限循环是由第 11 行(else statement)引起的,但我无法弄清楚确切的问题):

int main(){
    map<int,int> dic; //dic is the relevant map object
    dic[0]=1; dic[1]=1; dic[2]=1; dic[3]=1; //dic = {0:1, 1:1, 2:1, 3:1}

    int k=1;
    int sol=0;

    for(map<int,int>::iterator iter=dic.begin(); iter!=dic.end(); iter++){
        int a=iter->first; int b=iter->second;
        if(k==0) sol+=b*(b-1)/2;
        else sol+=b*dic[a+k]; //after some trials, I found that problem is in this line but I couldn't figure out the problem
    }
    return sol;
}

【问题讨论】:

  • Prefer ++iteriter++
  • 为什么会在这里有所作为?
  • 它不会影响代码的正确性,所以它只是一个注释。
  • "Prefer" 是一个带有解释的参考问题。
  • 当行为令人惊讶时,look up 它应该做什么并将其与您的假设进行比较。在这种情况下,您首先看到的是“[...] 如果这样的键不存在,则执行插入。”

标签: c++ dictionary infinite-loop


【解决方案1】:

这一行:

sol+=b*dic[a+k];

是否如果键 a+k 不存在,则向 map 添加一个新元素。

a 这里 一个键,所以 dic[a] 可以正常工作。但是,当 k 不是 0 时,您将面临访问不存在的地图元素的风险。

如果您想检查特定键是否存在,请使用map::find

此外,您观察到此代码导致无限循环是有效的,但在技术上是不正确的。键类型只能具有有限数量的值,因此最终循环将终止。不过可能需要相当长的时间。这假设您只使用不会溢出int 的键。

【讨论】:

  • a 是关键,但同样适用:在某些时候 a+k == 3 + 1 == 4 将创建 dic[4],迭代继续,dic[5] 将创建,依此类推。
  • @RoelSchroeven 没错,我错过了这一点,谢谢。
  • 需要澄清的是,for循环不会导致无限循环,因为a+k最多可以取2^32-1唯一值。
  • @lucieon 不会是2^32吗?最终密钥会溢出,但这段代码不会因此而停止。它将一直持续到计算出的密钥回绕并返回到 0。
  • @cdhowie 你是对的,它是2^32。我在考虑发表评论时可以采取的最大价值。但它会如何溢出?无论a+k 的结果是什么,它都是2^32 值之一。而且由于它是有限制的,iter 最终会达到dic.end()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-21
  • 2015-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多