是否可以使用 1D 索引访问 C++ 2D int 数组
Is it possible to access a C++ 2D int array using a 1D index?
根据标题,我正在寻找一种使用单个预计算索引访问 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++如何在内存中存储多维数组
然后使用一些索引操作。
相关文章:
- 2D数组来自文本输入,中间有空格
- 将值指定给向量(2D)的向量中的某个位置
- 如何使用用户输入在C++中正确填充2D数组
- 如何在C++中检查2D数组中负值的输入验证
- 当我在main中声明了我的2d数组时,为什么我的程序会退出
- 在 2D 向量中使用第三个 [ ] 有什么意义?
- 四边形的 2D 旋转
- 打印第二列时的2d字符矢量打印空间
- 如何将以逗号和空格分隔的整数读取到 2D 数组中?
- 如何在C++函数中声明静态 2D 数组?
- 我是 C++ 的初学者,我想知道如何在 2D 矢量中获取重复值
- 如何声明一个可以在整个程序中使用的全局 2d 3d 4d .. 数组(堆版本)变量?
- opengl glBegin(GL_LINES) 和 glBegin(GL_POINT) 在 2D 中不可视化点矢量
- 在C++中迭代 2D 容器的最干净方法
- 如何引用 2D 指针?
- 如何在 C++ 中使用它的构造函数初始化 unique_ptrs 的 2D 向量?
- C++动态安全 2D 交错阵列
- 如何在C++或OpenCV子矩阵中的2D子向量上使用OpenACC?
- 我已经阅读了很多关于 2d 数组的信息,但我在作业中使用它时遇到了麻烦
- 将 2D 推力::d evice_vector 复矩阵传递给 CUDA 内核函数