在 C++ 中使用 'deque' 的无限循环

Infinite loop with a 'deque' in c++

我对以下代码有疑问:

#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...。为什么会这样?

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

您可以解决这个问题,例如通过

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

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

要么修改 val,例如q.push_back(++val); 或打印 deque<int> q.

的内容

循环有两个问题。

第一个是变量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);
}

第二个是您在出队时推送 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 );
}