我正在解决一个问题,该问题要求我使用单下标数组来操作双下标数组。因此,问题是:如何将双下标数组转换为单下标数组?还是无法转换。如何通过单下标数组操作双下标? 例如:
int matrix[ m ][ n ];
//How can you transform matrix into array? Or operate it?
int array[ m * n ];
基本上,问题是这样问的:“创建一个类DoubleSubscriptedArray
。在构造时,该类应该能够创建任意数量的行和任意数量的列的数组。double的基础表示形式-下标数组应该是具有rows * columns
个元素数的整数的单下标数组。
答案 0 :(得分:3)
最简单的答案:
int array[m * n];
for (int y = 0; y < n; ++y) {
for (int x = 0; x < m; ++x) {
array[y * m + x] = matrix[x][y];
}
}
位置:
y
-行号x
-列号现在您需要将所有行序列化为一个:
row_no/col_no | 0 | 1 | 2 |
______________|___|___|___|
0 | 1 | 2 | 3 | <-- matrix data
1 | 4 | 5 | 6 |
||
\ /
\/
array_no 0 1 2 3 4 5
| | | | | |
[ 1, 2, 3, 4, 5, 6 ] <-- array data
array_no = row_no * number_of_rows + col_no
您可以 TEST :)
P.S您也可以这样:
int* array = (int*)matrix;
它是没有复制的版本:)
答案 1 :(得分:3)
您的矩阵连续存储为m乘n个元素。您可以做的是将矩阵的第一个元素解释为int *,然后有了数组。这样可以防止复制元素。
int main()
{
int matrix[3][3] = { {1, 0, 0}, {0, 1, 0}, {0, 0, 1} };
int* array = &matrix[0][0];
// int array[9] = {1, 0, 0, 0, 1, 0, 0, 0, 1}
return 0;
}
如果您需要复制元素,可以尝试
#include <memory>
int main()
{
int matrix[3][3] = { {1, 0, 0}, {0, 1, 0}, {0, 0, 1} };
int array[9];
std::memcpy(&array[0], &matrix[0][0], sizeof(array));
// int array[9] = {1, 0, 0, 0, 1, 0, 0, 0, 1}
return 0;
}
答案 2 :(得分:0)
您可以重新计算一维数组的索引以存储二维数组的核心对应值。
如果您需要复制,高效的方法是将原始行从两个暗淡数组复制到一个暗淡,这是因为多维数组以原始市长顺序存储, 索引可以计算为
oneDimIndex =行* n + col
您要在matrix [row,col]处获取元素的地方
然后,您可以通过相同的计算从一维数组中检索内容。