访问向量矢量<double *>

时间:2015-08-23 13:43:23

标签: c++ vector

我在向量中访问已保存的双打时遇到问题&lt;向量&lt; * double&gt;&gt;。 我正在读取.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 

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

1 个答案:

答案 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;
}

Live demo.