C ++动态(多阶段)3D矢量实例化和元素分配

时间:2011-07-29 15:30:49

标签: c++ vector 3d variable-assignment dynamic-memory-allocation

好的,所以我需要在运行时创建一个3D数据结构,我决定使用std :: vector,问题如下:我知道实例化时第一维的维度(当我创建时)我正在使用它的对象,但我不知道第二个维度直到运行时,第三维的大小可能会有所不同。 我创建了3D矢量并且运行时没有抱怨,但是我很难为元素分配值

此代码是我正在创建的对象的一部分。在课程定义中我有:

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> >() );
}

根据用户输入我需要创建一定大小的第二维,我为此调用一个方法:

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中

我还尝试使用 .resize(sizeOfDimThree)创建第3维,然后使用

进行分配
splits[dim1][dim2][i] = whatever;

但这根本不起作用 - 根本没有创建任何对象/元素。

我意识到这可能不是表达问题最直接的方式,但我认为这是最准确的,因为可能存在多点失败。

3 个答案:

答案 0 :(得分:2)

好的,事实证明,从技术上讲,一切都是正确的(尽管效率很低,我依次使用.resize()来获得适当的尺寸),我的'问题'是(因为它往往是)非常愚蠢的错误,以验证我使用过的所有内容:

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

而不是(因为拆分):

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

故事的道德:注意你如何对待变量数据类型&amp;发布完整源代码。

答案 1 :(得分:1)

看看boost :: multi数组是否有帮助,它可以执行以下操作:

 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

答案 2 :(得分:1)

如果您使用的是Linux,请使用valgrind检查代码。如果您的代码中存在内存错误(听起来就像您遇到的那样),valgrind应该公开它。