C ++ - 使用for()循环,队列弹出不正常工作

时间:2018-03-21 07:31:17

标签: for-loop visual-c++ while-loop queue

在使用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()循环工作类似吗?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

问题是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
}