C++ 在多维数组上迭代

C++ 在多维数组上迭代,c++,arrays,C++,Arrays,假设我想对多维数组中的每一个数字做点什么。我发现您可以获取第一个数字的指针,然后使用指针加法。例如,以下代码打印数字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; doubl

假设我想对多维数组中的每一个数字做点什么。我发现您可以获取第一个数字的指针,然后使用指针加法。例如,以下代码打印数字
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;
double a[2][3][2]={{{{1,2}、{3,4}、{5,6}、{{7,8}、{9,10}、{11,12};
双*p=&a[0][0][0];
对于(int i=0;i<12;i++)

cout是的,多维数组总是可以被视为平面数组。此外,与一维数组相同,您可以说
double*p=reinterpret\u cast(a)
,这与
double*p=&a[0][0][0]
相同


多维数组如果动态分配,可能不是平面数组。但这一点很明显,因为分配将由您完成。

是的,多维数组保证是平面的。然而,最好是这样做。如果您想在多维数组上进行平面迭代,我认为最好在其中引入范围视图:

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};
}
模板
结构平面{
自动开始(){return first(arr);}
自动结束(){
返回begin()+sizeof(arr)/sizeof(*begin());
}
模板X*first(X&val){return&val;}
模板自动优先(X(&val)[N]){返回优先(*val);}
T&arr;
};
模板
平展(T&arr){
返回平面{arr};
}
只需使用这个:

for (double d : flatten(a)) {
    std::cout << d << std::endl;
}
用于(双d:展平(a)){
std::cout虽然知道多维数组实际上是平面数组非常有用,但使用指针和指针算法来引用它通常是不规则的,因为它比惯用的解决方案下标表示法引入更多的错误可能性,更难阅读。因此,我建议使用以下方法:

double a[2][3][2] = {{{1, 2}, {3, 4}, {5, 6}}, {{7, 8}, {9, 10}, {11, 12}}};

for (int i = 0; i < 2; i++)
{
    for (int j = 0; j < 3; j++)
    {
        for (int k = 0; k < 2; k++)
        {
            cout << a[i][j][k] << endl;
        }
    }
}
double a[2][3][2]={{{{1,2}、{3,4}、{5,6}、{{7,8}、{9,10}、{11,12};
对于(int i=0;i<2;i++)
{
对于(int j=0;j<3;j++)
{
对于(int k=0;k<2;k++)
{

CUT我尝试了<代码>双*P= A;<代码> >错误:不能在初始化双(*)[3 ] [2 ]到“双*”,在初始化双*P= A;< /C> >我忘记了在C++中需要把指针类型匹配。我已经更新了我的答案,谢谢!<代码>双*P=重新解释(A)< /C> >工作。“三星级编程”是不是有点太复杂了?@Numeri不,不太复杂。