C++ 将二维和三维阵列展平为一维阵列的等效迭代?
我有以下用于将二维数组展平为1D C样式数组的代码:C++ 将二维和三维阵列展平为一维阵列的等效迭代?,c++,arrays,C++,Arrays,我有以下用于将二维数组展平为1D C样式数组的代码: #include <iostream> int main() { int width = 4, height = 4; int arr[width * height]; for (int i = 0, k = 0; i < height; ++i) { for (int j = 0; j < width; ++j) { arr
#include <iostream>
int main()
{
int width = 4, height = 4;
int arr[width * height];
for (int i = 0, k = 0; i < height; ++i)
{
for (int j = 0; j < width; ++j)
{
arr[i * width + j] = k++;
}
}
for (int i = 0; i < height; ++i)
{
for (int j = 0; j < width; ++j)
{
int* ptr = &arr[0] + height * i; //perfect also works with &arr[0] + width * i;
std::cout<<ptr[j]<<" ";
}
}
}
它失败了,如下所示:
如何对3D数组执行相同的操作?
int**
cast将一维数组转换为指针数组。它不会将值映射到平面数组
您可以使用
boost::multi_array
来执行您想要的操作。以下操作应该有效:
for (int i = 0, l = 0; i < depth; ++i) {
for (int j = 0; j < height; ++j) {
for (int k = 0; k < width; ++k) {
arr[k + width * (j + height * i)] = l++; // Index fixed
}
}
}
for (int i = 0; i < depth; ++i) {
int (&ptr)[height][width] = *reinterpret_cast<int (*)[height][width]>(&arr[0] + width * height * i);
for (int j = 0; j < height; ++j) {
for (int k = 0; k < width; ++k) {
std::cout << ptr[j][k] << " "; //this line should stay the same.
}
}
}
for(int i=0,l=0;i std::cout我的建议是永远不要这样做。为什么?对于2D和3D,或者只是不做3D?对于所有2D和3D…nD。但将2D数组映射到1D数组是完全有效的。我只是在将3D映射到1D或2D时遇到了一个问题。事实上,这样做是在欺骗编译器。俗话说:欺骗不是问题,但如果它被捕获,那么它就是问题一个问题(我忘记了确切的句子)。有时你可能会得到一些意想不到的结果。我认为没有办法将ptr
转换为int***
对吗?如果没有,那没关系,我仍然喜欢这个解决方案。@CantChooseUsernames:int-arr[depth][height][width]
和int-arr[depth*height*width]
是int
的平面连续序列(没有额外的指针)。int***
包含指针,不是int
的平面数组。
for (int i = 0, l = 0; i < depth; ++i) {
for (int j = 0; j < height; ++j) {
for (int k = 0; k < width; ++k) {
arr[k + width * (j + height * i)] = l++; // Index fixed
}
}
}
for (int i = 0; i < depth; ++i) {
int (&ptr)[height][width] = *reinterpret_cast<int (*)[height][width]>(&arr[0] + width * height * i);
for (int j = 0; j < height; ++j) {
for (int k = 0; k < width; ++k) {
std::cout << ptr[j][k] << " "; //this line should stay the same.
}
}
}
int (&ptr)[width] = *reinterpret_cast<int (*)[width]>(&arr[0] + width * i);