矢量的访问向量<双倍*>

Access Vector of Vectors <double*>

本文关键字:双倍 gt lt 访问 向量      更新时间:2023-10-16

我在访问vector <向量&>>。我正在阅读一个。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 

有什么想法吗?我应该做什么更改才能正确访问它?提前感谢!

问题是,在这些行中,您正在写入和读取一些随机的内存块:

valuebuffer >> *(tempVector.back() + numLoop);
cout << *(tempVector.back() + numLoop) << " ";

在调用push_back之后,tempVector.back()是对tempVector中最后一个元素的引用,该元素是指向大小为1的double数组中的第一个元素的指针。如果你把numLoop加到那个指针上,你会从double数组的末尾得到一些随机的内存块。

你可以通过修改这些行来"修复"它:

valuebuffer >> *tempVector.back();
cout << *tempVector.back() << " ";

但是,没有很好的理由为什么要分配一个大小为1的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;
}

现场演示。