C++ - 使用 for() 循环时队列弹出不起作用



在使用 STL 队列和for循环编写简单代码时,我遇到了一个问题。我的程序很简单:将数字作为字符串,将它们转换为队列元素并显示它们。

我的代码如下:

#include<iostream>
#include<queue>
#include<string>
//#include<cctype>
using namespace std;
//int to_words(int i);
//int to_words_one(queue<int> &q);
int main()
{
queue<int> q;
string s;
cout << "Enter a number not more than 12 digits : ";
getline(cin, s, 'n');
for (int i = 0; i < s.length(); i++)
{
    if (!isdigit(s[i]))
    {
        cout << "Not a valid number." << endl;
        s.clear();          
        break;
    }
}
if(s.size() > 0)
   for (int i = 0; i < s.length(); i++)
      q.push(s[i] - '0');
while (!q.empty())
{
    cout << q.front();
    q.pop();
}
system("PAUSE");
}

它工作正常。没关系。但是,while(!q.empty())如果我使用

for(int j=0;j < q.size(); j++)
{
   cout << q.front();
   q.pop();
}

它无法正常工作!它只是显示并弹出一些第一个元素,而不是队列的所有元素并提示Press any key to continue。请告诉我为什么会这样?while(!q.empty())和那个for()循环的工作方式不应该相似吗?

问题是q.size()在每次q.pop()后都会减少,并在 for 循环的每次迭代中进行评估。例如,假设您的队列中有 6 个元素,后续迭代中的 for 循环状态如下所示:

  • i = 0, q.size(( = 6,
  • i = 1, q.size(( = 5,
  • i = 2, q.size(( = 4,
  • i = 3,
  • q.size(( = 3,

因此,只会打印前 3 个元素。如果要使用 for 循环,请在第一次迭代之前将q.size()保存到变量中,如下所示:

int q_size = q.size();
for (int i = 0; i < q_size; i++) {
    // do something
} 

通过调用queue::pop队列的大小递减,因此假设您输入了 8 位数字,在 for 循环的第一次迭代中q.size()返回 8,然后您比较它是否为真j < 8并且j递增,队列大小递减。在循环的下一次迭代中,您比较j < 7,其中j为 1。执行第 2 次、第 3 次迭代...经过第 4 次迭代后j计数器的值为 4,队列大小也是 4,因此条件 j < 4 返回 false,并且只打印了 4 位数字。

最新更新