文件中重载的矢量

Overloaded Vector from File

本文关键字:重载 文件      更新时间:2023-10-16

我正试图将文件读取到多维向量中,但程序在到达文件中的最后一组数据时收到"向量下标超出范围"错误。

文件的格式如下:

[索引介于1-10000之间][空格][兰特介于1-100之间]

然而,每个索引都可能出现1-50次,所以文件最终看起来像这样:

http://pastebin.com/gvpd1HC0

以及介于两者之间的一切(我把数据改写得更短,但基础是一样的)。

这是代码:

ifstream file;
int frequentCatcher[1000];
int numDistItems = 10000;
vector< vector<int> > initialVec(numDistItems, vector<int>(50));
file.open("T25.N0.1K.D10K.txt");
for (int i = 0; i <= 999; i++)      //This loop sets all cells to 0 to begin.
{
    frequentCatcher[i] = 0;
}
if (file.good())
{
    int tracId = 1, tracNum = 0;        //counters to track position in file
    int id, num;                        //tracks actual data contained in file
    while (!file.eof())                 //traverse file
    {
        file >> id;                 //input from file
        file >> num;
        if (tracId == id)
        {
            initialVec[tracId][tracNum] = num;
            tracNum++;              
        }
        else
        {
            tracId++;
            tracNum = 0;        //reset item number each time a new transaction occurs
            initialVec[tracId][tracNum] = num;
            tracNum++;
        }
    }

错误发生在id变为10000的那一刻,向量错误被抛出,程序崩溃。这是在tracNum重置为0之后,但是文件仍然需要读取10000的所有值并在继续之前保存它们。

这里的问题是假设向量[i][j]已经存在。对于向量,它们是空的,直到保留一些插槽或项目推入向量。

矢量的矢量可能不是最好的数据类型,因为您不知道的范围。如果看到索引顺序为1、5、3、2、4,则会出现问题,因为它们不连续。

IMHO,一个更好的解决方案是std::map<int, vector<int> >。当键的范围未知或不按排序顺序排列时,map更适合排序。使用映射,可以测试索引(键)是否存在。如果关键点不存在,可以创建一个新矢量,并将其与关键点一起插入到贴图中。

如果关键点确实存在,则将值推回到向量中。