我正在尝试将文件读入多维向量,但程序在到达文件中的最后一组数据时会收到“向量下标超出范围”错误。
文件格式如下:
[1-10000之间的指数] [空格] [1-100之间的rand int]
然而,每个索引可以在1-50次之间的任何地方发生,因此文件最终看起来像这样:
介于两者之间的所有内容(我重新编写的数据更短,但基础相同)。
以下是代码:
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的所有值并保存它们才能继续。
答案 0 :(得分:0)
这里的问题是假设vector [i] [j]已经存在。对于向量,它们是空的,直到您保留某些插槽或将项目推送到向量中。
矢量矢量可能不是最佳数据类型,因为您事先并不知道键的范围。如果您看到索引顺序为1,5,3,2,4,则会出现问题,因为它们不是连续的。
恕我直言,更好的解决方案是 using (var wc = new System.Net.WebClient())
{
var uri = ("https://en.wikipedia.org/w/api.php?action=query&prop=imageinfo&format=json&iiprop=url&iiurlwidth=400&titles=File%3ALuftbild%20Flensburg%20Schleswig-Holstein%20Zentrum%20Stadthafen%20Foto%202012%20Wolfgang%20Pehlemann%20Steinberg-Ostsee%20IMG%206187.jpg%7CFile%3AHafen%20St%20Marien%20Flensburg2007.jpg%7CFile%3ANordertor%20im%20Schnee%20(Flensburg%2C%20Januar%202014).JPG");
var response = wc.DownloadString(new Uri(uri));
var responseJson = JsonConvert.DeserializeObject<RootObject>(response);
foreach(KeyValuePair<string, Pageval> entry in responseJson.query.pages)
{
var url = entry.Value.imageinfo.First().thumburl;
//Do something with url
Console.WriteLine(url);
}
}
。当键的范围未知或不按排序顺序排序时,std::map<int, vector<int> >
更适合排序。使用映射,您可以测试索引(键)是否存在。如果密钥不存在,您可以创建一个新的矢量并将其与密钥一起插入到地图中。
如果密钥确实存在,则将值push_back到向量中。