Я делаю программу, которая будет принимать текст и:
Но у меня возникает проблема, когда я пытаюсь сравнить строку с элементом 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);
}
Несколько подсказок:
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++;
}
}