我在向量中访问已保存的双打时遇到问题<向量< * double>>。 我正在读取.txt文件并在我的向量向量中保存存储在其中的值(应该构成一个矩阵)。
vector <vector<double*>> HypMean;
ifstream myFile;
myFile.open(nameOfFile);
if (myFile.is_open() && myFile.good()) {
string line;
while(getline(myFile, line)){ //Get line-by-line in file
istringstream buffer(line);
string value;
int numLoop = 0;
vector <double*> tempVector;
while (getline (buffer, value, ',')){ //Get character by character in line
istringstream valuebuffer(value);
tempVector.push_back(new double[1]);
valuebuffer >> *(tempVector.back() + numLoop);
cout << *(tempVector.back() + numLoop) << " ";
numLoop++;
}
HypMean.push_back(tempVector);
cout << endl;
}
myFile.close();
}
这是我的功能,我想我正在保存这些值,因为当我在创建它时打印“tempVector”并且它有效。
0.014872 0.078519 0.071838 -0.10371
-0.16741 -0.0063904 0.0018366 0.21238
0.13796 -0.29323 0.23489 -0.074523
然而,当我尝试访问整个事物(HypMean)时,我不知道该怎么做。我试过以下没有运气:
for (int x=0; x<3; x++){
for (int y=0; y<4; y++){
cout << *(HypMean[x][y]) << " ";
}
cout<<endl;
}
0.014872 -6.27744e+66 -6.27744e+66 -6.27744e+66
-0.16741 -6.27744e+66 -6.27744e+66 -6.27744e+66
0.13796 -6.27744e+66 -6.27744e+66 -6.27744e+66
有什么想法吗?我应该更改什么才能正确访问它? 提前谢谢!
答案 0 :(得分:1)
问题在于,在这些行中,您正在写入并读取一些随机内存:
valuebuffer >> *(tempVector.back() + numLoop);
cout << *(tempVector.back() + numLoop) << " ";
在调用push_back
之后,tempVector.back()
是对tempVector
中最后一个元素的引用,该元素是指向double
大小数组中第一个元素的指针1.如果将numLoop
添加到该指针,则会在该double
数组的末尾添加一些随机内存。
你可以修复&#34;通过将这些行更改为:
valuebuffer >> *tempVector.back();
cout << *tempVector.back() << " ";
但是,没有充分的理由可以分配大小为double
的数组。而不是std::vector<std::vector<double*>>
。只需要std::vector<std::vector<double>>
就可以更容易了,你可以用以下内容填充:
tempVector.push_back(0.0);
valuebuffer >> tempVector.back();
然后你可以用:
读取2D矢量for (int x=0; x<3; x++){
for (int y=0; y<4; y++){
cout << HypMean[x][y] << " ";
}
cout<<endl;
}
或者更好,
for (const auto& v : HypMean){
for (auto value : v) {
cout << value << " ";
}
cout<<endl;
}