Вне границы при переборе по вектору

Я делаю программу, которая будет принимать текст и:

  1. посчитайте, сколько раз слово найдено
  2. сохранить их в структуре
  3. распечатать, сколько раз слова найдены.

Но у меня возникает проблема, когда я пытаюсь сравнить строку с элементом struct string. Я получаю вектор вне диапазона. Пожалуйста, ознакомьтесь с кодом ниже. Надеюсь, кто-то может сказать мне, что я делаю неправильно

#include <iostream>
#include<string>
#include <vector>

using namespace std;


struct word_entry {
  string word;
  int amount;
} ;

typedef vector<word_entry>  type_of_vector;

void insert(type_of_vector word_storage,string word_to_insert)
{
  bool word_found =false;

  for(int i = 0;i<=word_storage.size();i++)
    {
      if(word_storage.at(i).word==word_to_insert) //crashes the program
        {
          word_storage.at(i).amount++; 
           word_found=true;
        } 
    }    
}

int main()
 {
   type_of_vector word_vector;
   string word_to_insert="kalle";   
   word_entry insert_word={word_to_insert,1};  
   word_vector.insert(word_vector.end(),insert_word);   
   insert(word_vector,word_to_insert); 
 }

3 ответа

Решение

Несколько подсказок:

using namespace std;

не включать в себя целый std пространство имен в вашем проекте

void insert(type_of_vector word_storage,string word_to_insert)

word_storage всегда будет копией того, что вы поместили в вызов функции, если вы не хотите копировать (и похоже, что вы этого не делаете) используйте ссылку type_of_vector& word_storage, Также имеет смысл использовать const string& word_to_insert, если word_to_insert не должен изменяться.

for(int i = 0;i<=word_storage.size();i++)

вы перебираете границы, используйте < сравните, а не <=

Должно быть

for(int i = 0; i < word_storage.size();i++)

Используйте "меньше", "<" вместо "меньше или равно" "<=".

Это для заявления

for(int i = 0;i<=word_storage.size();i++)

дает вам исключение, потому что индекс, равный szie(), недопустим. Допустимый диапазон для индексов - [0, size() - 1] при условии, что вектор не пуст.

Вместо цикла вы можете использовать стандартный алгоритм std::find_if. Например

void insert(type_of_vector &word_storage, const string &word_to_insert)
{
   auto it = std::find_if( word_storage.begin(), word_storage.end(), 
                           [&]( const word_entry &entry ) { return ( entry.word == word_to_insert ); } );         
   if( it != word_storage.end() )
   {
       it->amount++;
   }
}
Другие вопросы по тегам