在 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 );
}
我对以下代码有疑问:
#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 );
}