2015-08-23 3 views
0

У меня возникли проблемы с доступом к сохраненным удвоениям в моем векторе < vector < * double >>. Я читаю .txt-файл и сохраняю сохраненные в нем значения (которые должны составлять матрицу) в векторе векторов.Доступ вектора векторов <double*>

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 

Любые идеи, пожалуйста? Что я должен изменить, чтобы получить доступ к нему должным образом? Спасибо заранее!

+5

Почему «новый двойной [1]' ?? Почему бы не просто 'vector > HypMean;' ?? –

+3

Да, использование 'new' здесь совершенно лишнее. Кроме того, использование массива 'new' для выделения одного элемента не имеет смысла. Если у вас есть фон на C# или Java, не используйте их стиль использования 'new' в C++! –

ответ

1

Проблема заключается в том, что в этих строках вы пишете и чтение из некоторой случайной части памяти:

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

После вызова push_back, tempVector.back() является ссылкой на последний элемент в tempVector, который является указатель на первый элемент в массиве double размера 1. Если вы добавите numLoop к этому указателю, вы получите некоторую случайную часть памяти с конца этого массива double.

Вы можете «исправить» это, изменив эти строки:

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

Однако, нет никаких причин, почему вы направляете массив double размера 1. Вместо того, чтобы 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.

+0

Это именно то, что мне нужно! @Chris Drew Спасибо, что все имеет смысл сейчас! – Slash

Смежные вопросы