13

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

替代文字

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

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

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

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

拜托,我会很感激你帮助我。

提前致谢。

4

7 回答 7

22

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

一维数组:你可以很容易地做到这一点

const int MAX_SIZE=128;
int *arr1D = new int[MAX_SIZE];

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

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

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 阵列:这就是你想要做的。在这里,您可以尝试以上两种情况使用的方案。应用与二维数组相同的逻辑。有问题的图表说明了一切。第一个数组将是指针到指针的指针(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;
       }
   }
}
于 2010-10-11T08:20:46.763 回答
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++)

编辑以回应乔的问题

你好乔=)当然。这是示例:

#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;
}
于 2010-10-11T08:06:45.567 回答
1

What you're trying to do is not idiomatic in C++. Of course, you can use a int***pointer for this, but this is strongly discouraged. In C++ we have better ways to get there.

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

This will result in something with the memory layout similar to what you asked for. It supports dynamic resizing and inner vectors to have different sizes just like in your picture. In addition, you don't have to worry about manual allocation / deletion of any of it. Also, the vectors know their size so you don't have to remember it somewhere.

But if you just want a "rectangular" 3D array where all the elements are consecutivly stored in the same memory block, you could use a boost::multiarray.

于 2010-10-11T08:46:07.740 回答
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;
于 2010-10-11T07:52:45.047 回答
1

综合答案。

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

于 2010-10-11T08:16:30.960 回答
0

好的,让我们开始吧

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

sec 现在是一个长度为 x 的 int**s 数组,所以现在我将专注于使第 zeroeth 元素成为您想要的

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

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

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

最后把它变成你图表中的表格

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

这看起来有点像家庭作业问题,请确保您真正理解答案以及它为什么有效。

于 2010-10-11T07:43:37.517 回答
-1

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

不确定您到底想要什么,但您可能想阅读有关链表的信息。

于 2010-10-11T07:41:17.490 回答