根据标题,我正在寻找一种使用单个预计算索引访问2D int数组的方法。
换句话说,我想array[z]
代替array[x][y]
,而'array'仍为int[][]
有没有办法将数组转换为1D数组而没有任何开销?
我想避免使用指针(至少在某种意义上*(&array[0][0] + index)
),因为这对性能至关重要,在我的所有测试中它们都比较慢。我还想避免任何算术或函数调用,除非它们比仅以2D格式访问数组更轻。
答案 0 :(得分:1)
使用(&arr[0][0])[i * width + j]
??
是否有理由不想使用指针语法?它并不比索引慢。或者甚至只使用一维数组并将其视为二维数组?
#include <iostream>
#include <algorithm>
int main()
{
int arr[5][5];
int n = 0;
std::generate(&arr[0][0], &arr[4][5], [&] {return ++n;});
int* a = &arr[0][0];
std::for_each(&a[0], &a[25], [&](int i){std::cout<<i<<" ";});
/*int* a = &arr[0][0];
for (int i = 0; i < 5; ++i)
for (int j = 0; j < 5; ++j)
std::cout<<a[i * 5 + j]<<" ";*/
return 0;
}
答案 1 :(得分:0)
当然,有办法:
array[i*n + j]
i是行索引,j是列索引,n是行的长度。 当然,在此之前必须以适当的方式声明数组,例如:
std::vector<int> array(rows*cols);
编辑:
似乎我的问题出错了,sry。 我不知道通过只使用一个[]来处理int [] []的任何方法。 也许有一些奇怪的方法......我仍然宁愿首先使用1d阵列,我没有看到任何缺点。
答案 2 :(得分:0)