2013-12-01 2 views
-1

Итак, я прочитал проблему 4.5 с ускоренного C++ и интерпретировал ее довольно неправильно. Я написал программу, которая должна отображать количество слов в строке. Тем не менее, я, наверное, сделал что-то очень глупое и очень неправильно. Я не могу понять.Получение ошибки времени выполнения работы с векторами

Введите код: http://ideone.com/87zA7E.

Stackoverflow говорит, что ссылки на ideone.com должны сопровождаться кодом. Вместо того, чтобы наклеивать все это, я просто вставить функцию, которую я думаю, что, скорее всего, по вине:

vector<str_info> words(const vector<string>& s) { 

vector<str_info> rex; 
str_info record; 

typedef vector<string>::size_type str_sz; 
str_sz i = 0; 

while (i != s.size()) { 
    record.str = s[i]; 
    record.count = 0; 
    ++i; //edit 

    for (str_sz j = 0; j != s.size(); ++j) { 
     if (compare(record, s[j])) 
      ++record.count; 
    } 

    for (vector<str_info>::size_type k = 0; k != s.size(); ++k) { 
     if (!compare(record, rex[k].str)) 
      rex.push_back(record); 
    } 
} 

return rex; 
} 
+0

Где проблема? Что оно делает? – JeffRSon

+0

Ошибка времени выполнения. В прошлый раз, когда я запускал его на своем компьютере, он съел всю оперативную память. Однако даже после увеличения i-го, я все равно получаю ту же ошибку. –

ответ

1

Одна проблема заключается в том, что у вас есть это:

str_sz i = 0; 

while (i != s.size()) { 

, но вы никогда не увеличиваем i , что приводит к бесконечному циклу. Внутри этого цикла вы нажимаете элементы в вектор rex. Вектор не может содержать бесконечное число элементов.

+0

О, боже, я так глуп. Конечно! И теперь я чувствую себя таким смущенным. Сожалею. –

+0

Он все еще не решает проблему. Я думаю, что я использовал петли совершенно неправильно. Как вы думаете, у вас есть лучшее альтернативное решение, предполагающее, что вы понимаете, что я пытаюсь сделать? –

0

Кроме того, вы пытаетесь получить доступ:

rex[k].str 

в

for (vector<str_info>::size_type k = 0; k != s.size(); ++k) { 
     if (!compare(record, rex[k].str)) // rex is empty in the beginning!! 
      rex.push_back(record); 
    } 

Но вы не знаете, есть ли рекс к + 1 элементов в нем.

EDIT: Изменить код:

while (i != s.size()) { 

    // read new string into a record (initial count should be one). 
    str_info record; 
    record.str = s[i]; 
    record.count = 1; 

    // check if this string already exists in rex 
    bool found = false; 
    for (vector<str_info>::size_type k = 0; k < rex.size(); ++k) { 
     if (record.str == rex[k].str) { 
      rex[k].count++; 
      found = true; 
      break; 
     } 
    } 


    i++;   
    if (found) 
     continue; 

    // if it is not found then push_back to rex 
    rex.push_back(record); 
} 
+0

Вы думаете, что если я заменил s.size() на rex.size(), это сработает? –

+0

@ user35846 Тогда он никогда не войдет в цикл for. –

+0

@ user35846 Пожалуйста, расскажите, что вы пытаетесь сделать. –

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