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

C++ C++;动态(多阶段)3D矢量实例化和元素分配,c++,vector,3d,variable-assignment,dynamic-memory-allocation,C++,Vector,3d,Variable Assignment,Dynamic Memory Allocation,好的,所以我需要在运行时创建一个3D数据结构,我决定使用std::vector,问题如下:我在实例化时知道第一个维度的维度(当我创建我正在使用它的对象时),但直到运行时我才知道第二个维度的维度,第三个维度的大小可能会有所不同我已经创建了3D向量,运行时没有问题,但是我很难为元素赋值 这段代码是我正在创建的对象的一部分。在类定义中,我有: std::vector< std::vector< std::vector<double> > > splits; 但这根

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

这段代码是我正在创建的对象的一部分。在类定义中,我有:

std::vector< std::vector< std::vector<double> > > splits;
但这根本不起作用——根本没有创建对象/元素


我意识到这可能不是最直接的措辞方式,但我相信这是最准确的,因为可能有多个失败点。

看看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.
typedef boost::multi_array_type;
数组\类型::扩展\生成扩展;
数组_类型A(区段[3][3][3]);
A[0][0][0]=4;
A[2][2][2]=5;
A.调整大小(范围[2][3][4]);
断言(A[0][0][0]==4);
//[2][2][2]不再有效。

下面是链接:

看看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.
typedef boost::multi_array_type;
数组\类型::扩展\生成扩展;
数组_类型A(区段[3][3][3]);
A[0][0][0]=4;
A[2][2][2]=5;
A.调整大小(范围[2][3][4]);
断言(A[0][0][0]==4);
//[2][2][2]不再有效。

下面是链接:

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

如果您在Linux上,请与valgrind一起检查代码。如果你的代码中有内存错误(听起来像是你遇到的),valgrind应该公开它。

好的,所以事实证明,从技术上来说,一切都是正确的(尽管效率很低,我通过依次使用.resize()来调整适当的维度),我的“问题”是一个非常愚蠢的错误,为了验证是否分配了所有内容,我使用了:

printf("value assigned: %d", splits[dim1][dim2][dim3]);
而不是(因为拆分是双精度的):


故事的寓意:注意如何处理变量数据类型&post完整的源代码。

好的,所以事实证明,从技术上讲,一切都是正确的(尽管效率很低,我通过依次使用.resize()来处理适当的维度),我的“问题”是(通常是)一个非常愚蠢的错误,为了验证是否分配了所有内容,我使用了:

printf("value assigned: %d", splits[dim1][dim2][dim3]);
而不是(因为拆分是双精度的):


故事的寓意:注意如何处理变量数据类型&发布完整的源代码。

您确实意识到您可以使用一维向量并自己进行计算……您是否在任何地方按值传递拆分?(即,不是通过引用)。或者所有操作都是由类的成员方法完成的?您是否考虑过使用boost::multi_数组,它具有调整大小等功能。您说“根本没有创建对象/元素”是什么意思?您是如何得出这个结论的?@Michael Dorgan:是的。@约翰逊:它上的所有操作都是通过类方法执行的。@Gearoid Murphy:在调试过程中,我依次检查了每个维度的大小。你知道你可以使用一个1维的向量,然后自己做数学计算……你是否通过值传递拆分?(即,不是通过引用)。或者所有操作都是由类的成员方法完成的?您是否考虑过使用boost::multi_数组,它具有调整大小等功能。您说“根本没有创建对象/元素”是什么意思?您是如何得出这个结论的?@Michael Dorgan:是的。@约翰逊:它上的所有操作都是通过类方法执行的。@Gearoid Murphy:在调试过程中,我依次检查了每个维度的大小。谢谢,我想这可能会奏效。然而,我仍然想知道为什么我的3D矢量技巧不起作用。我可以想象为什么,因为我知道多维数组是如何线性表示的,但如果能确定这一点,那就太好了。谢谢,我想这可能会奏效。然而,我仍然想知道为什么我的3D矢量技巧不起作用。我可以想象为什么,因为我知道多维数组是如何线性表示的,但如果能确定这一点就好了。
 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.
printf("value assigned: %d", splits[dim1][dim2][dim3]);
printf("value assigned: %.3f", splits[dim1][dim2][dim3]);