2014-12-30 6 views
-4

У меня есть vector<vector<int>>, и я хочу поместить в него данные. Я должен вводить цифры до тех пор, пока первый член строки не будет -1 и -1 также ограничивает данные каждые vector<int>. Например:Ввод чисел до -1 вводится


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; 
    } 
} 
+1

Прежде всего, вы используете 'n', хотя вы еще не присвоили значение на' while n! = - 1'. Кроме того, 'temp.front()' может выполняться, даже если ваш вектор все еще пуст. – Lanting

+0

@Lanting Это не проблема в данном случае. – pesho

+0

Хотя это _might_ не проблема, это, безусловно, проблема _a_. –

ответ

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);   
} 
+0

Это неверно: это приведет к неопределенному поведению (и бесконечному циклу), если во входном есть что-то неожиданное. –

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; 
} 

Вы заметите, что это позволяет избежать неловкости от того, чтобы сломать из петли.

В общем, если вы обнаружите, что вам нужно вырваться из цикла, это знак , что у вас нет правильного алгоритма, или что вы - , пытаясь сделать слишком много в цикле. Аналогичным образом, вложенные циклы, , когда они не имеют дело с математическими матрицами, также являются симптомом .

И наконец: могу добавить, что этот тип входного формата довольно неестественный. Как правило, вы должны использовать строки как разделители между записями и конец файла в качестве окончательной записи.

Смежные вопросы