【问题标题】:Infinite loop with a 'deque' in c++c++ 中带有“双端队列”的无限循环
【发布时间】:2019-09-10 12:47:30
【问题描述】:

我对以下代码有疑问:

#include <iostream>
#include <deque>

using namespace std;

int main() {
    deque<int> q = {1};

    for (int val = q.front(); !q.empty(); q.pop_front()) {
        cout << val << endl;
        q.push_back(val + 1);
        q.push_back(val + 2);
    }

}

它会产生一个无限循环(这是正确的),但不是打印1 2 3 4 ...,而是打印1 1 1 1 1...。为什么会这样?

【问题讨论】:

  • valfor 循环的第一次迭代之前的初始分配之后在哪里更新?

标签: c++ loops for-loop infinite-loop deque


【解决方案1】:

您永远不会更新整数val。它仅在 for 循环的第一部分初始化,并且当您将容器的第一个值复制到其中时,它会一直打印。

你可以解决这个问题,例如由

for (int val = q.front(); !q.empty(); q.pop_front(), val = q.front())
{
   // as before...
}

【讨论】:

    【解决方案2】:

    那是因为您从不修改val 的值。您将其初始化为 int val = q.front(),这是它最后一次更改。

    修改val,例如q.push_back(++val); 或打印deque&lt;int&gt; q 的内容。

    【讨论】:

      【解决方案3】:

      循环有两个问题。

      第一个是变量val在循环中没有变化,它在循环的init部分设置的初始值总是输出。

      for (int val = q.front(); !q.empty(); q.pop_front()) {
           ^^^^^^^^^^^^^^^^^^^   
          cout << val << endl;
          q.push_back(val + 1);
          q.push_back(val + 2);
      }
      

      第二个是你在 dequeue 上推送 two 值,然后它包含 three 值,包括前一个值。但在循环的第三部分,表达式

      q.pop_front()
      

      只从出队中弹出一个值。

      循环可以如下所示

      #include <iostream>
      #include <deque>
      
      int main()
      {
          std::deque<int> q = { 1 };
      
          for ( ; !q.empty(); q.pop_front() ) 
          {
              auto val = q.front();
              std::cout << val << '\n';
              q.push_back( ++val );
          }
      }
      

      或者循环可以不用像var这样的中间变量来写

      for ( ; !q.empty(); q.pop_front() ) 
      {
          std::cout << q.front() << '\n';
          q.push_back( q.front() + 1 );
      }
      

      【讨论】:

        猜你喜欢
        • 2012-10-10
        • 2011-02-14
        • 2013-01-05
        • 2015-05-14
        • 2014-08-11
        • 1970-01-01
        • 2018-07-12
        • 2018-10-11
        • 2013-02-15
        相关资源
        最近更新 更多