在迭代矢量的同时,不在绑定中

out of bound while iterating over vector

本文关键字:绑定 迭代      更新时间:2023-10-16

我正在制作一个程序,该程序将包含文本和:

  1. 计算一个单词的数量
  2. 将它们保存到结构
  3. 打印出发现了多少次。

,但是当我尝试将字符串与结构字符串成员进行比较时,我遇到了问题。我使矢量超出了范围。请查看下面的代码。希望有人能告诉我我做错了什么

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

必须为

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

使用"小于"'&lt;'而不是"小于或等于"'&lt; ='。

几个提示:

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++)

您正在迭代范围,使用<比较而不是<=

this for语句

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