【问题标题】:out of bound while iterating over vector迭代向量时越界
【发布时间】:2014-02-27 04:04:04
【问题描述】:

我正在制作一个接收文本的程序,并且:

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

【问题讨论】:

  • 你迭代越界,简单明了。仔细看看你的循环。
  • 提示:向量的大小和可以在该向量上使用的最大索引之间有什么关系?

标签: c++ vector indexoutofboundsexception


【解决方案1】:

应该是的

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

使用“小于”'

【讨论】:

  • 更好的是,如果您使用 C++11,请使用基于范围的 for:for (word_entry&amp; entry : word_storage)
【解决方案2】:

一些提示:

using namespace std;

不要在你的项目中包含整个 std 命名空间

void insert(type_of_vector word_storage,string word_to_insert)

word_storage 将始终是您在函数调用中放置的内容的副本,如果您不想要副本(而且看起来您不想要),请使用参考 type_of_vector&amp; word_storage。如果 word_to_insert 不应该改变,使用 const string&amp; word_to_insert 也是有意义的。

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

你迭代越界,使用&lt;比较而不是&lt;=

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-19
      • 2018-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-20
      • 2020-04-25
      • 1970-01-01
      相关资源
      最近更新 更多