迭代多维数组

Pau*_*ton 3 c++ arrays

假设我想为多维数组中的每个数字做一些事情.我发现你可以获得第一个数字的指针然后使用use pointer添加.例如,以下代码1通过以下方式打印数字12:

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;
Run Code Online (Sandbox Code Playgroud)

以这种方式考虑多维阵列是否平坦是不通常的吗?如果是这样,这样做的首选方式是什么?另外,有一种更简单的方法来编写double *p = &a[0][0][0];多维数组中第一个数字的指针(就像你只能double *p = a;为一维数组编写一样)吗?

Bar*_*rry 6

是的,多维数组保证是平坦的.但是,最好是这种事情.如果你想在多维数组上进行平面迭代,我认为最好在其中引入一个范围视图:

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};
}
Run Code Online (Sandbox Code Playgroud)

只需使用那个:

for (double d : flatten(a)) {
    std::cout << d << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

否则,唯一的另一种宣告方式p是,double *p = &***a;我不确定成为一名三星级程序员是否在你的人生成就列表中占据重要位置.

  • 加上一个"三星级节目" (2认同)