好的,所以我需要在运行时创建一个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;
但这根本不起作用 - 根本没有创建任何对象/元素。
我意识到这可能不是表达问题最直接的方式,但我认为这是最准确的,因为可能存在多点失败。
答案 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应该公开它。