【问题标题】:C++ dynamic (multi-stage) 3D vector instantiation and element assignmentC++ 动态(多阶段)3D 矢量实例化和元素分配
【发布时间】:2011-10-16 01:42:05
【问题描述】:

好的,所以我需要在运行时创建一个 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 不断变化(并且是双精度),您不必担心低维索引,一切都检查出来。)问题是 - 当我检查 splits[dim1][dim2][i] 值是 0.0 对于(大概所有)条目,自然这不是 提供的一些值

我也尝试使用 .resize(sizeOfDimThree) 创建第三维,然后使用分配

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

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

我意识到这可能不是最直接的表达问题的方式,但我相信它是最准确的,因为可能存在多点故障。

【问题讨论】:

  • 您确实意识到您可以使用 1 个暗淡向量并自己进行数学运算...
  • 您是否在任何地方按值传递拆分? (即,而不是通过引用)。还是类的成员方法对其进行的所有操作?
  • 你有没有考虑过使用 boost::multi_array,它有调整大小等。
  • 你说“根本没有创建对象/元素”是什么意思,你是怎么得出这个结论的?
  • @Michael Dorgan:是的。 @C约翰逊:对它的所有操作都是通过类方法来执行的。 @Gearoid Murphy:在调试过程中,我依次检查了每个维度的大小。

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


【解决方案1】:

好吧,事实证明,从技术上讲,一切都是正确的(尽管效率低下,我通过依次使用 .resize() 来解决适当的尺寸问题),我的“问题”是(因为它往往是)一个非常愚蠢的错误,以验证我使用的所有内容都已分配:

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

而不是(因为 splitsdouble):

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

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

【讨论】:

    【解决方案2】:

    看看 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

    【讨论】:

    • 谢谢,我想这可能会奏效。但是,我仍然想知道为什么我的 3D 矢量技巧不起作用。我可以想象为什么,因为我知道多维数组是如何线性表示的,但如果能确定会很好。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多