如何优雅的实现多维数组

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

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

成都创新互联公司专业为企业提供玉田网站建设、玉田做网站、玉田网站设计、玉田网站制作等企业网站建设、网页设计与制作、玉田企业网站模板建站服务,10余年玉田做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。

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

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

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

std::array, 3> multi_array;

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

那有没有办法,正常的使用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;
}
}
}
}
}

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

文章标题:如何优雅的实现多维数组
标题来源:http://www.36103.cn/qtweb/news14/29314.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联