我有一个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;
}
}
答案 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;
}
你会发现这可以避免不得不打破的笨拙 走出循环。
一般来说,如果你发现你必须打破一个循环,它就是一个 表示你没有正确的算法,或者你是 试图在循环中做太多。同样,嵌套循环, 当不处理数学矩阵时,也是一种症状 这个。
最后:我可能会补充一点,这种输入格式是相当的 不自然。更典型的是,您使用行作为分隔符 条目之间和文件结尾作为最终条目。