假设我想为多维数组中的每个数字做一些事情。我发现您可以获得第一个数字的指针,然后使用指针加法。例如,以下代码打印从 12
到 1
的数字:
double a[2][3][2] = {{{1, 2}, {3, 4}, {5, 6}}, {{7, 8}, {9, 10}, {11, 12}}};
double *p = &a[0][0][0];
for (int i = 0; i < 12; i++)
cout << *(p + i) << endl;
以这种方式将多维数组视为平面是不是很不合常理?如果是这样,这样做的首选方法是什么?另外,有没有更简单的方法来编写 double *p = &a[0][0][0];
来获取多维数组中第一个数字的指针(以相同的方式你可以为一维数组编写 double *p = a;
)吗?
最佳答案
是的,多维数组保证是平坦的。但是,最好对这类事情进行分类。如果要对多维数组进行平面迭代,我认为最好在其中引入范围 View :
template <typename T>
struct Flat {
auto begin() { return first(arr); }
auto end() {
return begin() + sizeof(arr)/sizeof(*begin());
}
template <typename X> X* first(X& val) { return &val; }
template <typename X, size_t N> auto first(X(&val)[N]) { return first(*val); }
T& arr;
};
template <typename T>
Flat<T> flatten(T& arr) {
return Flat<T>{arr};
}
只需使用那个:
for (double d : flatten(a)) {
std::cout << d << std::endl;
}
否则,声明 p
的唯一其他方法是 double *p = &***a;
我不确定是否成为三星级程序员在您的人生成就列表中名列前茅。
关于c++ - 迭代多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33309666/