Rust中如何用变量初始化数值数组?(Java开发者求助)
在Rust中动态初始化填充0的二维数组
Java里可以很方便地用运行时参数初始化填充0的二维int数组:
public int do_something(int width, int height){ int[][] nums = new int[height][width]; return 1; }
但在Rust里直接用固定数组语法会报错:
fn do_something(n: usize, m: usize) -> i32 { let memo: [[i32; m]; n] = [[0; m]; n]; 1 }
原因是Rust的固定大小数组[T; N]要求长度N必须是编译期常量,运行时传入的n和m属于动态值,没法用来初始化这类数组。
你用嵌套循环实现的方案是可行的,但有更简洁的写法:
1. 用vec!宏快速生成Vec<Vec<i32>>
这是最接近Java写法的简洁实现:
fn do_something(n: usize, m: usize) -> i32 { let nums = vec![vec![0; m]; n]; println!("{:?}", nums); 1 }
vec![0; m]会生成一个长度为m、所有元素都是0的Vec<i32>,外层的vec![...; n]会复制这个内层向量n次,最终得到和嵌套循环完全一样的Vec<Vec<i32>>结构。
2. 用单Vec模拟连续内存的二维数组
如果你的场景对内存连续性有要求(比如需要更好的缓存性能),可以用单个一维Vec来模拟二维数组:
fn do_something(n: usize, m: usize) -> i32 { let nums = vec![0; n * m]; // 访问第i行第j列的元素:nums[i * m + j] println!("{:?}", nums); 1 }
这种方式的内存是连续分配的,比Vec<Vec>减少了外层向量的额外开销,只是需要手动计算索引来模拟二维访问。
内容的提问来源于stack exchange,提问作者Isaac Dzikum
相关产品推荐
相关产品推荐

