c++ - 迭代多维数组

标签 c++ arrays

假设我想为多维数组中的每个数字做一些事情。我发现您可以获得第一个数字的指针,然后使用指针加法。例如,以下代码打印从 121 的数字:

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/

相关文章:

c++ - 为什么我需要在这个函数中使用指向指针的指针而不是其他任何地方?

arrays - 将行优先维度切换为列优先维度

Javascript 在文本区域中两次输入未被 (/[\n\r]/gm) 检测到

c++ - 如何为 HTTP 代理服务器设置超时(不是连接超时)

c++ - GDI+支持图形加速吗?

c++ - 将模板化的 std::array<std::vector<T>, N> 放入构造函数初始化列表中

javascript - For 循环迭代同时发生而不是延迟

javascript - 计算 Json 数组中项目的大小

c++ - 使用 Asio (Boost) 通过网络发送灵活数量的数据

c++ - 获取没有对象的类的vtable