创建`char *** data`?

时间:2010-06-30 14:34:34

标签: c++ pointers

我必须创建一个三维数组,在创建对象时分配。在使用普通数组之前,我已经完成了这些工作。

typedef unsigned char byte;  // =|
byte ***data;

4 个答案:

答案 0 :(得分:3)

如果您使用的是C++,我强烈建议您使用std::vector代替原始数组。

类似的东西:

std::vector<std::vector<std::vector<char> > > data(3, std::vector<std::vector<char> >(3, std::vector<char>(3, 0)));

将创建char的3x3x3数组,全部初始化为0

然后,您可以像使用char***

一样访问这些项目
data[0][0][0] = 1;

根据您的需要,您可能只使用一个std::vector并将三维空间内嵌到其中。这将固定计算和复制操作,因为这些值将在连续的内存块中。

您可以根据需要内联值,但这是一个示例:

对于像这样的三维数组:

a----b
|\   |\
| d----c
e-|--f |
 \|   \|
  h----g

您可以将这样的值存储在内存中:

a, b, c, d, e, f, g, h

这需要一些数学,但是如果你将其封装起来,你甚至可以达到vector vector vector {{1}}的相同级别的可用性,并且具有更高的性能。

答案 1 :(得分:2)

char ***路由会给你留下不连续的内存,当事情变大时,这是一个主要的性能问题。如果必须使用本机数组,我将使用char *并执行以下操作:


const int xDim = ??;
const int yDim = ??;
const int zDim = ??;

char* array = new char[xDim*yDim*zDim];

// Then just create a good indexing scheme.
char getElement(char* array, int x, int y, int z)
{
   // ultimately this is not hard to figure out, but I know I will
   // screw it up here and I don't have time to test the code.
   int element = some function of x,y,z,xDim,yDim,zDim;
   return array[element];
}

这是它的基本性。如果你要走这条路,你应该考虑将char *包装在一个类(可能是Array3D)中,并将getElement作为成员函数。

同样,STL可能更合适。

事实上,我认为不使用STL的唯一好理由是确保连续的内存块,而char ***也不会这样做。

答案 2 :(得分:0)

好吧,作为您可能想要处理的第一个猜测:

for(int i=0; i < length; ++i){
    data = new char**[size];
    for(int j = 0; j < anotherLength; ++j){
        data[i] = new char*[anotherSize];
        ...

明白了吗?就个人而言,我会使用vector的{​​{1}}个vector,最后一个成分为string

答案 3 :(得分:0)

三重间接通常是一种不好的方法,除非你真的需要数组数组(例如,如果array[0]的大小必须与array[1]的大小不同)。对于简单的多维数组,请使用类似Boost.MultiArray的内容。