输入数字直到-1被输入

时间:2014-12-30 17:30:40

标签: c++ vector

我有一个vector<vector<int>>我希望将数据放入其中。我应输入数字,直到行的第一个成员为-1-1也会分隔每vector<int>应保留的数据。例如:


The contents of vector<vector<int>>
1 1 1 0 0 1 -1 // -1 indicates the end of input for vector<int> number 1
1 1 0 1 -1 // vector<int> number 2
-1  // indicates the end of input from the console

我的应用程序在第一个输入的行之后崩溃,我不知道为什么?任何想法如何解决它?代码如下:


#include <iostream>
#include <vector>
using namespace std;

int main()
{
   vector<vector<int>> waiters;
   int n=0;    

   while(true)
   {
      vector<int> temp;
      while(n!=-1)
      {
        cin>>n;
        temp.push_back(n);
      }
      if(temp.front()== -1)
        break;
      else
        waiters.push_back(temp);        
   }
    for(int i=0;i<waiters.size();i++){
    for(int j=0;j<waiters.at(j).size();j++)
        cout<<waiters.at(i).at(j)<<" ";
    cout<<endl;
    }
}

2 个答案:

答案 0 :(得分:4)

问题是,输入完整行后,n永远不会重置为默认值,但仍然包含-1。在下一次迭代中,这将导致跳过内部while循环并在空向量上调用temp.front(),这是未定义的行为。以下更新可让您重回正轨。

while(true)
{
    vector<int> temp;
    while(n!=-1)
    {
        cin>>n;
        temp.push_back(n);
    }
    n = 0; // RESET n to a default value

    // Add additional check just to be sure.
    if(temp.size() == 0 || temp.front()== -1)
      break;

    waiters.push_back(temp);        
}

答案 1 :(得分:0)

真正的问题是你在尝试做太多事情 单一功能。你真的需要两个功能:

std::vector<int>
parseLine( std::istream& source )
{
    std::vector<int> results;
    int value;
    while ( source >> value && value != -1 ) {
        results.push_back( value );
    }
    return results;
}

然后:

std::vector<std::vector<int>>
getWaiters( std::istream& source )
{
    std::vector<std::vector<int>> results;
    std::vector<int> line = parseLine( source );
    while ( !line.empty() ) {
        results.push_back( line );
        line = parseLine( source );
    }
    return results;
}

你会发现这可以避免不得不打破的笨拙 走出循环。

一般来说,如果你发现你必须打破一个循环,它就是一个 表示你没有正确的算法,或者你是 试图在循环中做太多。同样,嵌套循环, 当不处理数学矩阵时,也是一种症状 这个。

最后:我可能会补充一点,这种输入格式是相当的 不自然。更典型的是,您使用行作为分隔符 条目之间和文件结尾作为最终条目。

相关问题