我正在制作一个将收录文字的节目:
但是当我尝试将字符串与结构字符串成员进行比较时,我遇到了问题。 我得到的矢量超出了范围。请查看以下代码。希望有人可以告诉我我做错了什么
#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);
}
答案 0 :(得分:5)
必须是
for(int i = 0; i < word_storage.size();i++)
使用“小于”'&lt;'而不是“小于或等于”'&lt; ='。
答案 1 :(得分:4)
几点提示:
using namespace std;
在项目中不要包含整个std
命名空间
void insert(type_of_vector word_storage,string word_to_insert)
word_storage将始终是您在函数调用中放置的内容的副本,如果您不想要副本(并且看起来您不喜欢),请使用引用type_of_vector& word_storage
。如果不应该改变word_to_insert,那么使用const string& word_to_insert
也是有意义的。
for(int i = 0;i<=word_storage.size();i++)
你正在迭代越界,使用<
比较而不是<=
答案 2 :(得分:0)
这句话
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++;
}
}