使用int []运算符的3D数组C ++

时间:2010-10-11 07:34:05

标签: c++ arrays pointers multidimensional-array dynamic-arrays

我是C / C ++的新手,我一直在讨厌,但仍然不知道如何制作像这样的“结构”

alt text

它应该是一个使用指针的3D动态数组。

我是这样开始的,但卡在那里

  int x=5,y=4,z=3;
  int ***sec=new int **[x];

知道如何制作静态大小的y和z就足够了;

拜托,我很感谢你帮助我。

提前致谢。

7 个答案:

答案 0 :(得分:21)

要动态创建3D整数数组,最好先了解1D和2D数组。

1D数组:您可以通过

轻松完成此操作
const int MAX_SIZE=128;
int *arr1D = new int[MAX_SIZE];

这里,我们创建一个int指针,它指向一个可以存储整数的内存块。

2D数组:您可以使用上述1D数组的解决方案来创建2D数组。首先,创建一个指向内存块的指针,其中只保存其他整数指针,最终指向实际数据。因为我们的第一个指针指向一个指针数组,所以这将被称为指针指针(双指针)。

const int HEIGHT=20;
const int WIDTH=20;

int **arr2D = new int*[WIDTH];  //create an array of int pointers (int*), that will point to 
                                //data as described in 1D array.
for(int i = 0;i < WIDTH; i++){
      arr2D[i] = new int[HEIGHT]; 
}

3D阵列:这就是你想要做的。在这里,您可以尝试上述两种情况中使用的方案。应用与2D阵列相同的逻辑。有问题的图解释了所有。第一个数组将是指向指针的指针(int *** - 因为它指向双指针)。解决方案如下:

const int X=20;
const int Y=20;
const int z=20;

int ***arr3D = new int**[X];
for(int i =0; i<X; i++){
   arr3D[i] = new int*[Y];
   for(int j =0; j<Y; j++){
       arr3D[i][j] = new int[Z];
       for(int k = 0; k<Z;k++){
          arr3D[i][j][k] = 0;
       }
   }
}

答案 1 :(得分:11)

// one-liner
typedef std::vector<std::vector<std::vector<int> > > ThreeDimensions;
// expanded
typedef std::vector<int> OneDimension;
typedef std::vector<OneDimension> TwoDimensions;
typedef std::vector<TwoDimension> ThreeDimensions;

(毕竟这是标记的c ++)

编辑以回应Joe的问题

再次问好Joe =)肯定。这是一个例子:

#include <vector>
#include <iostream>

int main(int argc, char* const argv[]) {

    /* one-liner */
    typedef std::vector<std::vector<std::vector<int> > >ThreeDimensions;
    /* expanded */
    typedef std::vector<int>OneDimension;
    typedef std::vector<OneDimension>TwoDimensions;
    typedef std::vector<TwoDimensions>ThreeDimensions;

    /*
       create 3 * 10 * 25 array filled with '12'
     */
    const size_t NElements1(25);
    const size_t NElements2(10);
    const size_t NElements3(3);
    const int InitialValueForAllEntries(12);

    ThreeDimensions three_dim(NElements3, TwoDimensions(NElements2, OneDimension(NElements1, InitialValueForAllEntries)));

    /* the easiest way to assign a value is to use the subscript operator */
    three_dim[0][0][0] = 11;
    /* now read the value: */
    std::cout << "It should be 11: " << three_dim[0][0][0] << "\n";
    /* every other value should be 12: */
    std::cout << "It should be 12: " << three_dim[0][1][0] << "\n";

    /* get a reference to a 2d vector: */
    TwoDimensions& two_dim(three_dim[1]);

    /* assignment */
    two_dim[2][4] = -1;
    /* read it: */
    std::cout << "It should be -1: " << two_dim[2][4] << "\n";

    /* get a reference to a 1d vector: */
    OneDimension& one_dim(two_dim[2]);

    /* read it (this is two_dim[2][4], aka three_dim[1][2][4]): */
    std::cout << "It should be -1: " << one_dim[4] << "\n";
    /* you can also use at(size_t): */
    std::cout << "It should be 12: " << one_dim.at(5) << "\n";

    return 0;
}

答案 2 :(得分:1)

您可以尝试:

for(int i=0;i<x;i++) {
  sec[i] = new int *[y];
  for(int j=0;j<y;j++) {
    sec[i][j] = new int [z];
  }
}

完成使用此内存后,您可以将其解除分配为:

for(int i=0;i<x;i++) {
  for(int j=0;j<y;j++) {
    delete [] sec[i][j];
  }
  delete [] sec[i];
}
delete [] sec;

答案 3 :(得分:1)

综合答案。

如果你真的是用C ++编写的(不是粗略的C),我认为你应该再看看这个复杂的数据结构。 IMO重新设计,同时牢记你要做的事情会更好。

答案 4 :(得分:1)

你想要做的不是C ++中的惯用语。当然,你可以使用int***pointer,但强烈建议不要这样做。在C ++中,我们有更好的方法来实现目标。

vector<vector<vector<int> > > foo (5,vector<vector<int> >(4, vector<int>(3)));

这将导致内存布局类似于您要求的内容。它支持动态调整大小,内部矢量具有不同的大小,就像你的图片一样。此外,您不必担心手动分配/删除任何内容。此外,向量知道它们的大小,所以你不必在某处记住它。

但如果您只想要一个“矩形”3D阵列,其中所有元素都连续存储在同一个内存块中,您可以使用boost::multiarray

答案 5 :(得分:0)

好吧,让我们开始吧

int ***sec = new int**[x]; 

sec现在是长度为x的整数数组,所以现在我将专注于使零点元素成为你想要的

sec[0] = new int*[y];

现在sec [0]指向长度为y的int * s数组,现在只需要完成树的最后一位,所以

sec[0][0] = new int[z];

最后将其添加到图表中的表单

sec[0][0][z-1] = 0;

这看起来有点像家庭作业问题,请确保您真正了解答案及其工作原理。

答案 6 :(得分:-1)

如果这是实际的数组,你在这里看到问题:Declaring a pointer to multidimensional array and allocating the array

不确定您想要什么,但您可能想了解链接列表。