标准::超出矢量<string>范围

std::out of range of vector<string>

本文关键字:string gt 范围 lt 标准      更新时间:2023-10-16

我知道这个问题太老了,但是我找不到任何解决方法。

这是我的代码:

#include "iostream"
#include "string"
#include "vector"
#include "conio.h"
#include "fstream"
using namespace std;
using std::vector;
#define Ifile "Input.txt"
#define Ofile "Output.txt"
#define token1 "."
#define token2 "!"
#define token3 "?"
struct Wordcount
{
        string wor;
        int NOtime;
};
void SplitParagraph(vector<string> &source,string token);
void Import(vector<string> &source);
int Wordcounting(string s);
vector<Wordcount> Listword(vector<string> source);
vector<string> SplitSentence(string s);
vector<string> Themostwords(vector<Wordcount> List);
vector<vector<string>> WordSort(vector<string> List);
void Export(vector<string>& source,vector<Wordcount>& List,vector<string>& TheMost,vector<vector<string>> WordSort);
void main()
{
        vector<string> source;
        Import(source);
        Export(source,Listword(source),Themostwords(Listword(source)),WordSort(source));
        cout<<"Completed, please see the result in "<<Ofile;
        _getch();
}
void SplitParagraph(vector<string> &source,string token)
{
        for(int i = 0;i<source.size();i++)
        {
                char *temp = NULL;
                temp = (char *)source.at(i).c_str();
                string tempsentence=strtok(temp,token.c_str());
                while(!tempsentence.empty())
                {
                        source.insert(source.begin()+i,tempsentence);
                        i++;
                }
        }
}
void Import(vector<string> &source)
{
        fstream file;
        char* fin = "Input.txt";
        file.open(fin,ios::in||ios::out);
        while(!file.eof())
        {
                getline(file,source.at(0));
        }
        SplitParagraph(source,token1);
        SplitParagraph(source,token2);
        SplitParagraph(source,token3);
        file.close();
}
int Wordcounting(string s)
{
        int count = 0;
        for(int i = 0;i<s.length();i++)
        {
                if(s[i] == ' ')
                        count++;
        }
        return count;
}
vector<Wordcount> Listword(vector<string> source)
{
        vector<Wordcount> List;
        vector<string> newsource = source;
        SplitParagraph(newsource," ");
        for(int i = 0;i<newsource.size();i++)
                for(int j = 0;j<List.size();j++)
                        if(newsource.at(i) == List.at(j).wor)
                                List.at(j).NOtime++;
                        else
                        {
                                List.at(List.size()).wor = newsource.at(i);
                                List.at(List.size()).NOtime = 0;
                        }
        return List;
}
vector<string> SplitSentence(string s)
{
        vector<string> result;
        char * S = new char[s.length() + 1];
        std::strcpy(S,s.c_str());
        string temp = strtok(S," ");
        while(temp.empty())
        {
                result.at(result.size())=temp;
                temp = strtok(S," ");
        }
        return result;
}
vector<string> Themostwords(vector<Wordcount> List)
{
        vector<string> result;
        int max = 0;
        for(int i = 0;i<List.size();i++)
                if(max<List.at(i).NOtime)
                        max = List.at(i).NOtime;
        for(int i = 0;i<List.size();i++)
                if(max == List.at(i).NOtime)
                        result.at(result.size()) = List.at(i).wor;
        return result;
}
vector<vector<string>> WordSort(vector<string> List)
{
        vector<vector<string>> result;
        for(int i = 0;i<List.size();i++)
                result.at(i) = SplitSentence(List.at(i));
        for(int i = 0;i<List.size();i++)
                for(int j = 0;j<result.at(i).size();j++)
                        for(int k = result.at(i).size(); k>j; k--)
                        {
                                int leng = result.at(i).at(j).length()<result.at(i).at(k).length()?result.at(i).at(j).length():result.at(i).at(k).length();
                                for(int z = 0;z<leng;z++)
                                        if((int)result.at(i).at(j)[z]<(int)result.at(i).at(k)[z])
                                        {
                                                string temp;
                                                temp = result.at(i).at(j);
                                                result.at(i).at(j)=result.at(i).at(k);
                                                result.at(i).at(k)=temp;
                                        }
                        }
                        return result;
}
void Export(vector<string>& source,vector<Wordcount>& List,vector<string>& TheMost,vector<vector<string>> WordSort)
{
        fstream data;
        data.open(Ofile,ios::out);
        data<<source.size()<<endl;
        for(int i = 0;i<source.size();i++)
                data<<List.at(i).NOtime<<endl;
        for(int i = 0;i<TheMost.size();i++)
                data<<TheMost.at(i)<<" ";
        data<<" ";
        for(int i = 0;i<WordSort.size();i++)
        {
                for(int j = 0;j<WordSort.at(i).size();j++)
                        data<<WordSort.at(i).at(j)<<" ";
                data<<endl;
        }
        data.close();
}

I got problem in

void Import(vector<string> &source)
{
        fstream file;
        char* fin = "Input.txt";
        file.open(fin,ios::in||ios::out);
        while(!file.eof())
        {
                getline(file,source.at(0));
        }
        SplitParagraph(source,token1);
        SplitParagraph(source,token2);
        SplitParagraph(source,token3);
        file.close();
}

当我跑到

getline(file,source.at(0));

编译器说:未处理的异常在0x758E1D4D在02.exe: Microsoft c++ exception: std::out_of_range在内存位置0x003FF4D8.

然后使用std::string

void Import(vector<string> &source)
{
        fstream file;
        char* fin = "Input.txt";
        file.open(fin,ios::in||ios::out);
        std:string STRING;
        while(!file.eof())
        {
                getline(file,STRING);
        }
        SplitParagraph(source,token1);
        SplitParagraph(source,token2);
        SplitParagraph(source,token3);
        file.close();
}

但是我不知道如何复制"STRING"到"source"

我试着搜索但没有找到。

如何修复out_of_range错误或将"STRING"复制到"source"

我所需要的就是解决这个问题。

谢谢!

您必须访问一个空的vector。将代码getline(file,source.at(0));替换为

string temp;
getline(file,temp); //store the string in temporary variable
source.push_back(temp); // add the string in vector
void Import(vector<string> &source)
{
        fstream file;
        char* fin = "Input.txt";
        file.open(fin,ios::in||ios::out);
        std:string STRING;
        while(!file.eof())
        {
                getline(file,STRING);
                source.push_back(STRING);
        }
        SplitParagraph(source,token1);
        SplitParagraph(source,token2);
        SplitParagraph(source,token3);
        file.close();
}