C++ 如何将三维尺寸不固定的三维阵列展平为一维阵列?

C++ 如何将三维尺寸不固定的三维阵列展平为一维阵列?,c++,arrays,c++11,multidimensional-array,C++,Arrays,C++11,Multidimensional Array,给定一个2D数组,其中每个(x,y)单元包含一个大小不同的字符串向量(为简单起见) 将此数据结构展平为1D数组的最有效方法是什么,即创建一个函数,将每个字符串内射映射到{1,…,n},其中n是数据结构中字符串的总数。简单的直接方法不适合您吗 #包括 #包括 int main(){ std::vector omg[3][4]; std::向量rv; 用于(自动常量和行:omg){ 用于(自动常量和单元格:行){ 用于(自动常量和str:cell){ rv.推回(str); } } } } 您可以将

给定一个2D数组,其中每个(x,y)单元包含一个大小不同的字符串向量(为简单起见)


将此数据结构展平为1D数组的最有效方法是什么,即创建一个函数,将每个字符串内射映射到{1,…,n},其中n是数据结构中字符串的总数。

简单的直接方法不适合您吗

#包括
#包括
int main(){
std::vector omg[3][4];
std::向量rv;
用于(自动常量和行:omg){
用于(自动常量和单元格:行){
用于(自动常量和str:cell){
rv.推回(str);
}
}
}
}

您可以将索引
i、j、k
映射到O(1)中的线性位置
p
,再映射到O(logn),其中
N
是2D数组的大小,而不是字符串的总数

首先,让我们将二维数组视为一维数组,因为这样做只会使事情变得更简单。Index
i
是数组中向量的索引。索引
k
是字符串在向量中的位置
N
是数组的大小

您可以创建一个整数数组(例如,
size\t
),用于保存所有向量长度的从零开始的累积和:

lengths = array[N]
lengths[0] = 0
for(i = 1 to N)
    lengths[i] = lengths[i - 1] + size(array[i - 1])
如果需要,可以将字符串总数计算为
total=length[N-1]+size(数组[N-1])

现在,对于索引
i,k
处的给定字符串,扩展数组中的位置仅为

p = lengths[i] + k
给定一个位置
p
,使用二等分算法将其映射到
i,k
(当找不到精确匹配时返回左边界索引的二进制搜索):

二分法是一种简化的二进制搜索,所以O(logn)

在开始展开向量之前,所有这些都非常有效。此时,插入和删除成为O(N)操作,因为需要增加或减少超过插入点的所有累积和。插入:

array[i][k].push(a_string)
for(z = i + 1 to N)
    lengths[z]++
并删除:

array[i][k].pop()
for(z = i + 1 to N)
    lengths[z]--
顺便说一句,如果您仍然想对数组使用索引
x,y
,可以使用

i = x + C * y
x = i % C
y = i / C

这里,
C
是数组中的列数。你可以很容易地将其推广到任意数量的维度。

你的标题是3D,但你在正文中只提到2D。是哪一个?或者这是一个关于多维数组的更一般的问题。@AdrianMole显然,不精确的三维是表中每个单元格中的向量。@bipll啊,这很有意义。记录相同大小的二维数组中字符串长度的累计和。字符串i,j,k的位置为cs[i][j]+k。另一方面,进行二进制搜索并减去左边界OK。享受。让我知道我是否可以改进我的伪代码这并不能回答我的问题,因为我希望能够将一维数组中的每个单元格映射到三维数组中的相应单元格,反之亦然。哦,你想进行反向映射吗?酷,那么你需要在1D数组中或者在其字符串中对向量大小/边界进行编码。否则,您需要细化不同的大小,例如,假设向量的大小始终由其在表中的位置的确定函数计算。
i = x + C * y
x = i % C
y = i / C