我必须创建一个三维数组,在创建对象时分配。在使用普通数组之前,我已经完成了这些工作。
typedef unsigned char byte; // =|
byte ***data;
答案 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的内容。