您现在的位置是:首页 > Javascript
当前栏目
如何优雅的实现多维数组
2023-02-25 18:26:32 时间
数组,想必大家都知道,大体长这样:
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;
}
}
}
}
}
看,这样就方便多了吧,这样就可以使用常规的方式定义正确的多维数组啦。
相关文章
- JDK中内嵌JS引擎介绍及使用
- 49195,npm最后的疯狂?盘点10款最有前途JavaScript构建工具
- 译文:5个增强Node.js应用程序增强功能
- 4个例子,吃透 JavaScript 实现的二叉搜索树 BST
- Vue中使用XML和JSON格式互转插件
- JDK中Jshell简单使用(JDK9版本以上或者JDK9版本)
- shiro中的JSP标签支持
- Java技术点-json转对象,对象转json
- SpringBoot+SpringDataJpa @Query之 JPQL使用书写模板(模糊查询and条件查询)
- Spring Boot中的Freemarker模版引擎引用css和js的正确姿势
- Node.js解压版的环境配置及相关常用命令
- JSP学习笔记(6)—— 自定义MVC框架
- JSP学习笔记(5)——Servlet、监听器、过滤器、MVC模式介绍
- Jsp学习笔记(4)——分页查询
- APIJSON简单使用
- JSP学习笔记(3)——JSTL 标签库
- JSP学习笔记(1)——Jsp指令、动作元素和内置对象
- JavaScript ES6 Promise对象
- Web前端——JavaScript扩展补充
- Web前端——表单提交和Js添加选项