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

Is it possible to access a C++ 2D int array using a 1D index?

本文关键字:C++ 2D int 数组 访问 索引 可以使 1D 是否      更新时间:2023-10-16

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

换句话说,我想做array[z]而不是array[x][y],"数组"仍然是一个int[][]

有没有办法在没有任何开销的情况下将数组转换为 1D 数组?

我想避免使用指针(至少在*(&array[0][0] + index)意义上),因为这对性能至关重要,并且在我的所有测试中它们都较慢。(编辑:这是在旧的MSVC编译器上使用一组特定的优化标志 - 通常不是这种情况。我还想避免任何算术或函数调用,除非它们比仅访问 2D 格式的数组更轻。

使用(&arr[0][0])[i * width + j]呢?

有什么理由不想使用指针语法吗?它并不比指数慢。或者甚至只是使用 1D 数组并将其视为 2D 数组?

#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;
}

当然,有一种方法:

array[i*n + j]
I 是行索引,

j 是列索引,n 是行的长度。当然,在此之前必须以正确的方式声明数组,例如:

std::vector<int> array(rows*cols);

编辑:

看来我答错了问题,嘻嘻。我不知道有什么方法可以只使用一个 [] 来处理 int[][]。也许用一些奇怪的方法...我仍然更喜欢首先使用 1d 数组,我没有看到任何缺点。

是的,有一个简单的方法可以做到这一点。首先,确保您了解

C++如何在内存中存储多维数组

然后使用一些索引操作。