C++ 为什么这个向量下标超出范围?

C++ 为什么这个向量下标超出范围?,c++,vector,C++,Vector,是的,我正在学习向量。我试图读入一个文本文件,计算唯一单词的数量,然后输出一个文本文件(稍后会这样做)。在掌握发生了什么以及为什么/如何修复时,可能需要一些帮助 #include <iostream> #include <cstdlib> #include <fstream> #include <string> #include<vector> using namespace std; string toLower(string str

是的,我正在学习向量。我试图读入一个文本文件,计算唯一单词的数量,然后输出一个文本文件(稍后会这样做)。在掌握发生了什么以及为什么/如何修复时,可能需要一些帮助

#include <iostream>
#include <cstdlib>
#include <fstream>
#include <string>
#include<vector>
using namespace std;
string toLower(string str);
string eraseNonAlpha(string Ast);
string  wordWasher(string str);
int countUniqenum(vector<string>&v);
int main()
{   
    ifstream inputStream; //the input file stream
    string word; //a word read in from the file
    string words=wordWasher(word);
    inputStream.open("alpha.txt");
    if (inputStream.fail())
    {
        cout<<"Can't find or open file"<<endl;
        cout<<"UR a loser"<<endl;
        system("pause");
        return 0;
    }//end if

    while (!inputStream.eof())
    {
        inputStream>>words;

    }//end loop

    vector<string> v;
    v.push_back(words);
    int unique =countUniqenum(v);
    cout<<unique<<endl;
    inputStream.close();

system("pause");
return 0;

}

string toLower(string str)
{

       for(int i=0;i<str.length();i++)
       {
               if (str[i]>='A'&& str[i]<='Z')
                 str[i]=str[i]+32;
       }
     return str;
}
string eraseNonAlpha(string str)
{
    for(int i=0;i<str.length();i++)
    {
        if(!((str[i]>='A'&&str[i]<='Z')||(str[i]>='a'&&str[i]<='z'))) 
        {str.erase(i,1);
        i--;
    }   
    }
    return str;
}

string  wordWasher(string str)
{   str=eraseNonAlpha(str);
    str=toLower(str);
    return str;
}                               
int countUniqenum(vector<string>&v)
{ int count=0;
  for(int i=0;i<v.size();i++)
  {
          if(v[i]!=v[i+1])
          count++;
  }     
  return count;
}  
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
串低(串短);
字符串橡皮擦(字符串Ast);
字符串字清洗程序(stringstr);
int countUniqenum(向量&v);
int main()
{   
ifstream inputStream;//输入文件流
string word;//从文件中读入的单词
字符串字=字洗涤器(字);
inputStream.open(“alpha.txt”);
if(inputStream.fail())
{

cout在这里,你肯定是超越了界限:

for(int i=0;i<v.size();i++)
{
      if(v[i]!=v[i+1])
//               ^^^

for(int i=0;i您肯定超出了这里的界限:

for(int i=0;i<v.size();i++)
{
      if(v[i]!=v[i+1])
//               ^^^
for(int i=0;i如果(v[i]!=v[i+1])这是一行
if(v[i]!=v[i+1])
。在你最后一次循环中,
v[i]
是向量的最后一个元素,
v[i+1]
结束

一个简单的解决方法是将循环更改为
(inti=0;i
。我不确定该函数是否真的实现了您希望它做的事情,但这至少可以避免崩溃。

如果(v[i]!=v[i+1])
这是一行
如果(v[i]!=v[i+1])
是向量的最后一个元素,
v[i+1]
位于末尾


一个简单的解决方法是将循环更改为
(inti=0;i
。我不确定该函数是否真的执行了您希望它执行的操作,但这至少可以避免崩溃。

是否应该对向量进行排序以使其工作。您只是检查相邻的单词是否相同

if(v[i]!=v[i+1])

你不应该对向量进行排序吗?你只是在检查相邻的单词是否相同

if(v[i]!=v[i+1])

顺便说一句,你的问题最好通过增加映射中的条目来解决。顺便说一句,你的问题最好通过增加映射中的条目来解决。一些解释:
v.size()-1
是向量的最后一个索引。任何更大的值都会使您超出范围。在for循环的最后一次迭代中,
i
等于
v.size()-1
,因为这是
等轴解释:
v.size()的最后一种情况-1
是向量的最后一个索引。任何更大的值都会使您超出范围。在for循环的最后一次迭代中,
i
等于
v.size()-1
,因为这是
i