【问题标题】:C++ - A 3-d data structure - should I use vector of pointers or vector of vectors?C++ - 3-d 数据结构 - 我应该使用指针向量还是向量向量?
【发布时间】:2015-09-20 02:26:09
【问题描述】:

我必须维护一个 3 维的数据结构。所以让我们说它的尺寸是:- l x m x n。在我希望编写的程序中,l 和 m 在构建数据结构时就已经知道了。但是 n 在整个运行时必须是动态的。对于网格 lxm 中的不同向量,n 可能不同。 (一旦创建了这个结构,我就不会打算破坏它,因为我会一直需要它)。

暂时让我们假设它是我想要制作的二维数据结构,我应该制作 vector> 还是 vector*> ?我也知道在第一种情况下如何将向量初始化为所需的大小,即我可能会做类似的事情:-

vector<vector<int> > A(m)

将外部尺寸的大小初始化为 m。但是在第二种情况下,一旦我创建了一个指向向量的指针向量,我如何创建指针指向的向量。

将其带到 3-d 案例中,我应该使用 , vector> 或 vector> 或其他组合?

请提出任何更改建议,以便我可以在未正确构建问题时重新构建问题。

【问题讨论】:

    标签: c++ arrays vector


    【解决方案1】:

    您最好使用单个vector(而不是嵌套的),因为在这种情况下可以保证内存是连续的,并且由于没有缓存未命中,您的代码会更快。在这种情况下,您需要从 3D (2D) 映射到 1D,反之亦然,但这非常简单

    对于 2D:

    (x,y) <-> y*DIM_X + x;
    

    对于 3D:

    (x,y,z) <-> z*(DIM_Y*DIM_X) + y*DIM_X + x;
    

    如果你真的坚持使用嵌套向量,你可以这样做:

    #include <vector>
    
    template<typename T>
    using vec = std::vector<T>; // to save some typing
    
    int main()
    {
        // creates a 5 x 4 x 3 vector of vector of vector
        vec<vec<vec<double>>> v{5, vec<vec<double>>{4, vec<double>{3}}};
    }
    

    编辑

    响应您的最新编辑:使用

    std::vector<std::vector<double>> v{DIM_X*DIM_Y, std::vector<double>};
    // address (x,y,z)
    v[y*DIM_X+x, z] = val_x_y_z;
    

    如果您进一步了解内部向量的维度,您可以使用std::vector::reserve 为它们预分配内存。这将加快速度,因为不会有任何(缓慢的)重新分配。

    【讨论】:

    • 所以你提到这个是针对 2-d 案例还是 3-d 案例?我的意思是这个公式。
    • 我还是有些困惑。让我们考虑二维情况。我创建了一个向量:- vector A ?我应该如何在其中插入元素?外部尺寸是固定的,但内部是动态的。
    • @ameyask86 你创建一个大小为DIM_X x DIM_Y 的向量,例如std::vector&lt;double&gt; v(DIM_X * DIM_Y);,然后通过公式v[y*DIM_Y+x] = val_x_y; 插入其中,你打算之后更改DIM_Y 维度吗?跨度>
    • 是的,第二个维度是可变的。正如我所提到的,它是动态的。因此我很困惑如何插入元素。它不仅是动态的,向量的大小也会不同。例如,我可以将二维结构设为:- {3,8},{1,2,3},{4,6,7} 。在这个例子中,外部维度的大小是 3,另一个维度是可变的,对于第一个向量它的 2,对于第二个它的 3,对于第三个它的 3。结构以后可能变成:- {3,8},{1,2 ,3},{4,6,7,9,11} ,即在第三个向量中添加了 2 个元素。
    • @ameyask86 那么你有类似矩阵的东西还是只是一个向量的向量,后者是各种维度的?如果是这种情况,那么你需要使用vector&lt;vector&lt;&gt;&gt;,没有别的办法。但在这种情况下,你不应该说你有一个L x M x N 结构,因为你确实有一个类似于矩形网格的东西,其中包含可变长度的“列”。在这种情况下,您可以通过使用 vector&lt;vector&gt;(而不是 vector&lt;vector&lt;vector&gt;&gt;,将 2D 转换为 1D,但对可变长度列使用内部向量)来加快程序速度。
    【解决方案2】:

    不,使用适当的多维数组:Boost MultiArray http://www.boost.org/doc/libs/1_59_0/libs/multi_array/doc/user.html

    #include "boost/multi_array.hpp"
    
    int main () {
      // Create a 3D array that is 3 x 4 x 2
      typedef boost::multi_array<int, 3> array_type;
      typedef array_type::index index;
      array_type A(boost::extents[3][4][2]);
    
      // Assign values to the elements
      int values = 0;
      for(index i = 0; i != 3; ++i) 
        for(index j = 0; j != 4; ++j)
          for(index k = 0; k != 2; ++k)
            A[i][j][k] = values++;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-07
      • 2018-08-28
      • 1970-01-01
      • 2020-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多