是否可以使用1D索引访问C ++ 2D int数组?

时间:2014-02-22 00:06:52

标签: c++ arrays

根据标题,我正在寻找一种使用单个预计算索引访问2D int数组的方法。

换句话说,我想array[z]代替array[x][y],而'array'仍为int[][]

有没有办法将数组转换为1D数组而没有任何开销?

我想避免使用指针(至少在某种意义上*(&array[0][0] + index)),因为这对性能至关重要,在我的所有测试中它们都比较慢。我还想避免任何算术或函数调用,除非它们比仅以2D格式访问数组更轻。

3 个答案:

答案 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)

是的,有一种直接的方法可以做到这一点。首先,确保您理解

how does C++ store multidimensional arrays in the memory

然后使用一些索引操作。