我是C / C ++的新手,我一直在讨厌,但仍然不知道如何制作像这样的“结构”
它应该是一个使用指针的3D动态数组。
我是这样开始的,但卡在那里
int x=5,y=4,z=3;
int ***sec=new int **[x];
知道如何制作静态大小的y和z就足够了;
拜托,我很感谢你帮助我。
提前致谢。
答案 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
不确定您想要什么,但您可能想了解链接列表。