如何优雅的实现多维数组

开发 前端
定义好了二维数组,那三维、四维、五维数组如何定义?难道要像上面一样,定义出ThreeDimMatrix、FourDimMatrix?肯定不能这样,那可是太麻烦了,也不通用。

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

int native_arr[3];
std::array<int, 3> arr;

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

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

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

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

std::array<std::array<int, 4>, 3> multi_array;

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

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

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

template <typename T, size_t R, size_t C>
using TwoDimMatrix = std::array<std::array<T, C>, R>;

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

void test_two_dim_matrix() {
constexpr size_t row = 2;
constexpr size_t col = 3;
TwoDimMatrix<int, row, col> 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 <typename T, size_t R, size_t... C>
struct Matrix {
using Col = typename Matrix<T, C...>::type;
using type = std::array<Col, R>;
};

template <typename T, size_t R>
struct Matrix<T, R> {
using type = std::array<T, R>;
};

使用方式如下:

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<int, a, b, c, d>::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;
}
}
}
}
}

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

责任编辑:武晓燕 来源: 程序喵大人
相关推荐

2010-10-08 13:21:03

JavaScript多维数组

2020-08-26 07:17:19

通信

2011-06-08 15:21:18

多维数组

2024-01-17 10:16:22

前端国际化消息键

2023-01-31 10:29:26

JavaScript国际化国际化库

2009-11-25 14:44:34

PHP函数array_

2009-09-16 09:01:40

C#多维数组

2020-08-24 13:35:59

trycatchJava

2023-10-27 08:20:12

springboot微服务

2011-06-08 14:42:33

C++多维数组

2009-11-20 09:24:10

PHP多维数组排序

2010-03-15 13:17:00

Python多维数组

2011-07-04 11:05:03

数组java

2009-09-17 16:36:59

C#一维数组C#多维数组

2022-11-15 07:50:47

ORM链式操作删除

2022-11-11 07:48:56

ORM链式轮播图

2021-05-12 22:07:43

并发编排任务

2022-06-04 12:25:10

解密加密过滤器

2020-12-08 08:08:51

Java接口数据

2021-03-09 13:18:53

加密解密参数
点赞
收藏

51CTO技术栈公众号