在向量上迭代时出界

时间:2014-02-03 15:31:19

标签: c++ vector indexoutofboundsexception

我正在制作一个将收录文字的节目:

  1. 计算找到一个单词的次数
  2. 将它们保存到结构
  3. 打印出找到这些单词的次数。
  4. 但是当我尝试将字符串与结构字符串成员进行比较时,我遇到了问题。 我得到的矢量超出了范围。请查看以下代码。希望有人可以告诉我我做错了什么

    #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 个答案:

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