如何优雅的实现多维数组?

数组,想必大家都知道,大体长这样:

int native_arr[3];
std::array arr;

那二维数组呢?假如我需要定义一个3行4列的数组,是不是这样:

int multi_array_native[3][4];
std::array, 4> multi_array;

第一眼看上去,貌似没啥毛病。


但其实不对,上面的multi_array其实是个4行3列的数组,然而这才是个正确的3行4列的数组:

std::array, 3> multi_array;

这块其实就很容易写出不容易发现的bug,可能二维数组还好一些,如果是多维数组,更难办。


嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!

无偿分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。

点击这里找小助理0元领取:嵌入式物联网学习资料(头条)


如何优雅的实现多维数组?


如何优雅的实现多维数组?


那有没有办法,正常的使用std::array实现多维数组呢?


肯定有,就是利用好模板元编程技巧,这里先来实现个二维数组:

template 
using TwoDimMatrix = std::array, R>;

其实就是将反直觉的R和C调换个顺序,使用方式如下:

void test_two_dim_matrix() {
    constexpr size_t row = 2;
    constexpr size_t col = 3;
    TwoDimMatrix mat;
    int k = 0;
    for (int i = 0; i < row; ++i) {
        for (int j = 0; j < col; ++j) {
            mat[i][j] = ++k;
        }
    }
}

使用TwoDimMatrix,就可以正常的定义二维数组,而无需反常规的按相反顺序定义数组。


定义好了二维数组,那三维、四维、五维数组如何定义?难道要像上面一样,定义出ThreeDimMatrix、FourDimMatrix?


肯定不能这样,那可是太麻烦了,也不通用。


这里可能利用模板的可变参数来实现,直接上代码吧:

template 
struct Matrix {
    using Col = typename Matrix::type;
    using type = std::array;
};


template 
struct Matrix {
    using type = std::array;
};

使用方式如下:

void test_multi_array() {
    constexpr size_t a = 2;
    constexpr size_t b = 3;
    constexpr size_t c = 4;
    constexpr size_t d = 5;
    Matrix::type mat;
    int u = 0;
    for (int i = 0; i < a; ++i) {
        for (int j = 0; j < b; ++j) {
            for (int k = 0; k < c; ++k) {
                for (int m = 0; m < d; ++m) {
                    mat[i][j][k][m] = ++u;
                }
            }
        }
    }
}

看,这样就方便多了吧,这样就可以使用常规的方式定义正确的多维数组了。


希望这个小技巧能,对大家有所帮助。


原文链接:https://mp.weixin.qq.com/s/7iAjROnV0migdhV4B15urg

转载自:嵌入式微处理器

原文链接:如何优雅的实现多维数组?

本文来源网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章