C++ c++;:分离故障(堆芯倾倒)

C++ c++;:分离故障(堆芯倾倒),c++,fault,C++,Fault,我的程序的目的是读取文件中的单词并计算每个单词的出现次数。代码如下: #include <iostream> #include <fstream> #include <vector> #include <algorithm> using namespace std; int main() { vector<string> v, vdist; string parola; int j=0; ifstre

我的程序的目的是读取文件中的单词并计算每个单词的出现次数。代码如下:

#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    vector<string> v, vdist;
    string parola;
    int j=0;
    ifstream myfile("example.txt");
    if (myfile.is_open()) {
        cout << "file opened\n";
        while (! myfile.eof() ) {
            myfile >> parola;
            v.push_back(parola);
        }
        cout << "dimensione file: " << v.size() << endl;
        for (int i=0; i< v.size(); i++) {
            cout << i << "   " << v[i] << endl;
        }
        sort(v.begin(),v.end());
        for (int i=0; i<= v.size()-1; i++) {
            if (v[i] != v[i+1]) {
                vdist[j] = v[i];
                cout << vdist[j] << endl;
                j++;
            }
            vdist[j]= v[v.size()-1];
            j++;
        }
    } else 
        cout << "file not opened\n";

    return 0;
}

为什么会发生这种情况?

vdist
是空的,因此
vdist[j]
是不允许的

相反,看起来您希望将值推送到向量的末尾:

vdist.push_back(v[i]);
一旦进行了更改,
j
变量将是多余的,因此您应该删除它


在最后一次迭代中,您还有一个问题,
v[i+1]
超出了范围。您需要解决这个问题-可能提前停止一个迭代,或者以不同的方式对待最后一个迭代。

vdist
为空,因此
vdist[j]
是不允许的

相反,看起来您希望将值推送到向量的末尾:

vdist.push_back(v[i]);
一旦进行了更改,
j
变量将是多余的,因此您应该删除它


在最后一次迭代中,您还有一个问题,
v[i+1]
超出了范围。您需要解决这一问题—可能提前停止一个迭代,或者可能以与其他迭代不同的方式对待最终迭代。

另外,作为一般规则,当您访问容器时,请确保容器存在(如果它是指针),并且索引没有超出范围。如果容器来自stl,您可以使用迭代器对其进行迭代,这样更安全。是的!!我真蠢!!非常感谢,现在它工作得非常好!再次感谢!另外,作为一般规则,当您访问容器时,确保容器存在(如果它是指针),并且索引没有超出范围。如果容器来自stl,您可以使用迭代器对其进行迭代,这样更安全。是的!!我真蠢!!非常感谢,现在它工作得非常好!再次感谢!