C ++ динамическое (многоэтапное) создание 3D-векторов и присвоение элементов - PullRequest
1 голос
/ 29 июля 2011

Хорошо, поэтому мне нужно создать трехмерную структуру данных во время выполнения, я решил использовать std :: vector, проблема заключается в следующем: я знаю измерение 1-го измерения во время создания экземпляра (когда я создаю объект, в котором я его использую), но я не знаю размер второго до времени выполнения, а размер 3-го измерения может варьироваться. Я создал трехмерный вектор , и время выполнения не жалуется, однако мне трудно присвоить значения элементам.

Этот код является частью объекта, который я создаю. В определении класса у меня есть:

std::vector< std::vector< std::vector<double> > > splits;

Затем в конструкторе объектов, чтобы создать / выделить первое измерение, я имею:

for(int i=0; i<sizeOfDimOne; i++){ //create 1st dimension
    splits.push_back( std::vector< std::vector<double> >() );
}

на основе пользовательского ввода мне нужно создать 2-е измерение определенного размера, для этого я вызываю метод:

for(int i=0; i<sizeOfDimOne; i++){
    for(int j=0; j<sizeOfDimTwo; j++) //create second dimension
        splits[i].push_back( std::vector<double>() );
}

Однако, когда я получаю присвоение значений:

for(int i=0; i<sizeOfDimThree; i++){
   splits[dim1][dim2].push_back( someValue ); //adding an element to the 3rd dim
}

( someValue постоянно изменяется (и является двойным), и вам не нужно беспокоиться о индексации нижних измерений, все проверяется.) Проблема в том, что когда я проверял разбиения [dim1] [dim2] [i] значение было 0.0 для (предположительно всех) записей, естественно, это не то, что было предоставлено someValue .

Я также попытался создать 3-е измерение, используя .resize (sizeOfDimThree) , а затем присвоить, используя

splits[dim1][dim2][i] = whatever;

но это не сработало совсем - объект / элемент не был создан вообще.

Я понимаю, что, возможно, это не самый простой способ сформулировать вопрос, но я считаю, что он наиболее точный, поскольку может быть несколько точек неудачи.

Ответы [ 3 ]

2 голосов
/ 04 августа 2011

Хорошо, так получается, что технически все было правильно (хотя и неэффективно, что я обошел, используя .resize () для соответствующих измерений по очереди), моя «проблема» была (как это обычно бывает) очень глупая ошибка, чтобы убедиться, что все назначено, я использовал:

printf("value assigned: %d", splits[dim1][dim2][dim3]);

вместо (поскольку разделяется равно double ):

printf("value assigned: %.3f", splits[dim1][dim2][dim3]);

Мораль истории: обратите внимание на то, как вы относитесь к типу переменной data & post полный исходный код.

1 голос
/ 29 июля 2011

Если вы работаете в Linux, проверьте код с помощью valgrind.Если в вашем коде есть ошибка памяти (которая звучит как то, с чем вы сталкиваетесь), valgrind должен раскрыть ее.

1 голос
/ 29 июля 2011

Посмотрите, может ли помочь boost :: multi array, он может делать что-то вроде:

 typedef boost::multi_array<int, 3> array_type;

  array_type::extent_gen extents;
  array_type A(extents[3][3][3]);
  A[0][0][0] = 4;
  A[2][2][2] = 5;
  A.resize(extents[2][3][4]);
  assert(A[0][0][0] == 4);
  // A[2][2][2] is no longer valid.

Вот ссылка: http://www.boost.org/doc/libs/1_47_0/libs/multi_array/doc/user.html#sec_example

...