C++ C++;在多维数组中查找相邻值的数据结构

C++ C++;在多维数组中查找相邻值的数据结构,c++,arrays,data-structures,multidimensional-array,neighbours,C++,Arrays,Data Structures,Multidimensional Array,Neighbours,我有一个项目,在这个项目中,我读取一个具有1个或多个维度的数组,对于这个项目,我需要能够快速确定给定元素的邻居。我不知道提前的维度,同样我也不知道提前维度的大小。什么是最好的C++数据结构来存储这些数据?一位同事推荐了一个向量向量向量向量向量。,但是这看起来非常笨拙。如果你知道你需要邻居的元素的地址,你能做一下指针运算找出邻居吗。例如,如果p是元素的位置,那么p--是左邻居,p++是右邻居。如果您知道需要邻居的元素的地址,您可以执行指针算法来查找邻居。例如,如果p是元素的位置,那么p--是左邻居

我有一个项目,在这个项目中,我读取一个具有1个或多个维度的数组,对于这个项目,我需要能够快速确定给定元素的邻居。我不知道提前的维度,同样我也不知道提前维度的大小。什么是最好的C++数据结构来存储这些数据?一位同事推荐了一个向量向量向量向量向量。,但是这看起来非常笨拙。

如果你知道你需要邻居的元素的地址,你能做一下指针运算找出邻居吗。例如,如果p是元素的位置,那么p--是左邻居,p++是右邻居。

如果您知道需要邻居的元素的地址,您可以执行指针算法来查找邻居。例如,如果p是元素的位置,那么p--是左邻居,p++是右邻居。

将多维数组视为1D数组。让数组的维数为
d1*d2*…*dn

然后为1D数组分配内存,比如
a
大小
d1*d2*…*dn
。比如说,

int *A = new int[d1 * d2 * ....* dn];
如果需要将数据存储在
[i1][i2]…[in]
第个索引中,请存储在以下索引中:

A[i1 * (d2*d3*d4.. *dn) + i2 * (d3*d4*....dn) + ..... + in] 
相邻元素将是:

A[(i1 + 1) * (d2*d3*d4.. *dn) + i2 * (d3*d4*....dn) + ..... + in] 
A[(i1 - 1) * (d2*d3*d4.. *dn) + i2 * (d3*d4*....dn) + ..... + in] 

A[i1 * (d2*d3*d4.. *dn) + (i2 + 1) * (d3*d4*....dn) + ..... + in] 
A[i1 * (d2*d3*d4.. *dn) + (i2 - 1) * (d3*d4*....dn) + ..... + in] 

.............................
A[i1 * (d2*d3*d4.. *dn) + i2 * (d3*d4*....dn) + ..... + (in + 1)] 
A[i1 * (d2*d3*d4.. *dn) + i2 * (d3*d4*....dn) + ..... + (in - 1)] 

将多维数组视为1D数组。让数组的维数为
d1*d2*…*dn

然后为1D数组分配内存,比如
a
大小
d1*d2*…*dn
。比如说,

int *A = new int[d1 * d2 * ....* dn];
如果需要将数据存储在
[i1][i2]…[in]
第个索引中,请存储在以下索引中:

A[i1 * (d2*d3*d4.. *dn) + i2 * (d3*d4*....dn) + ..... + in] 
相邻元素将是:

A[(i1 + 1) * (d2*d3*d4.. *dn) + i2 * (d3*d4*....dn) + ..... + in] 
A[(i1 - 1) * (d2*d3*d4.. *dn) + i2 * (d3*d4*....dn) + ..... + in] 

A[i1 * (d2*d3*d4.. *dn) + (i2 + 1) * (d3*d4*....dn) + ..... + in] 
A[i1 * (d2*d3*d4.. *dn) + (i2 - 1) * (d3*d4*....dn) + ..... + in] 

.............................
A[i1 * (d2*d3*d4.. *dn) + i2 * (d3*d4*....dn) + ..... + (in + 1)] 
A[i1 * (d2*d3*d4.. *dn) + i2 * (d3*d4*....dn) + ..... + (in - 1)] 


你说的邻居是什么意思?如果有一个维度:索引x有邻居x-1和x+1;;;二维:索引(x,y)有邻居(x-1,y),(x+1,y),(x,y-1),(x,y+1)等。您对程序的输入是什么?我猜数组和数组元素的维数是多少?(如2×3和1, 2, 3,4, 5, 6)?是的,除了数据不在C++数组中;它在一个专有的包装类中,我必须从中提取数据。你只想要正交的邻居吗?(即,在二维情况下,最大值为4)或者您想要“完整邻域”,其中二维情况下最多会提供8个邻域?您所说的邻域是什么意思?如果有一维:索引x具有邻域x-1和x+1;;;二维:索引(x,y)有邻居(x-1,y),(x+1,y),(x,y-1),(x,y+1)等。您对程序的输入是什么?我猜数组和数组元素的维数是多少?(如2×3和1, 2, 3,4, 5, 6)?是的,除了数据不在C++数组中;它在一个专有的包装类中,我必须从中提取数据。你只想要正交的邻居吗?(也就是说,在二维案例中,最多有4个)或者你想要“完整的邻居”,在二维案例中,最多可以有8个邻居?我明白你的意思,但我首先需要弄清楚存储数据的方式,这样做是可行的。我才意识到我忘了提到一些东西,所以我将复制我上面评论的:数据不是在C++数组中;我必须从一个专有的包装类中提取数据。所以我想接下来要问的问题是,在决定结构之前,需要从包装类中维护什么样的信息。因为如果需要根据键查找某个内容,那么映射将更适合你。我明白你的意思,但我需要首先确定如何存储数据,这样的事情是可行的。我只是意识到我忘了提到一些东西,所以我将复制我上面所说的:数据不是在C++数组中;我必须从一个专有的包装类中提取数据。所以我想接下来要问的问题是,在决定结构之前,您需要从包装类中维护什么样的信息。因为如果您需要根据键查找某个内容,那么映射将更适合您。