文件中重载的矢量
Overloaded Vector from File
我正试图将文件读取到多维向量中,但程序在到达文件中的最后一组数据时收到"向量下标超出范围"错误。
文件的格式如下:
[索引介于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
更适合排序。使用映射,可以测试索引(键)是否存在。如果关键点不存在,可以创建一个新矢量,并将其与关键点一起插入到贴图中。
如果关键点确实存在,则将值推回到向量中。
相关文章:
- .h 文件中<<运算符重载
- 如何重载 << 运算符,以便将对象的数据写入文件?
- 包括来自另一个文件的运算符重载
- 如何让 + 重载在另一个文件C++中被识别?
- 如何在C++中包含头文件时错误地重载
- C++头/实现文件中的默认和重载构造函数?
- 从文件重载运算符>>读取单词
- 如何重载流运算符以使用位于不同文件中的函数
- 将单独的头文件和类定义文件链接到主函数文件 - G++ 返回重载"undefined reference to"构造函数
- 重载>>运算符以读取文本文件
- 重载 .h 文件中的'+'运算符,链接器错误
- 堆重载的2-D矩阵和c++中的读取文件
- C++头/实现文件和重载运算符
- 重载内存映射文件加载程序(C++)
- 重载运算符 '=' 和 [] 以写入文件中的位置
- 如何处理dervied类的多个重载,而不需要对其他文件进行多次更改
- 文件的 C++ 重载运算符 []
- 有关重载用于读取文本文件的输入运算符>>的问题
- 重载要输出到文件中的<<
- 在 c++ 头文件中声明重载运算符时遇到问题