Rust中如何初始化元组向量数组以实现加权邻接表
Rust 加权邻接表初始化方法
你遇到的核心问题是Rust数组初始化的语法限制:[T; N] 形式的初始化要求元素类型实现Copy,而Vec是堆分配类型,没有实现Copy,所以不能直接用[Vec::new(); MM]完成初始化,以下是几种可行的写法:
推荐写法1:编译期固定长度用array::from_fn
如果MM是编译期常量(和你给出的代码场景一致),用标准库的from_fn方法为每个位置单独生成空Vec即可,从Rust 1.63版本开始该方法已稳定,无额外运行时开销:
const MM: usize = 100; let mut adj: [Vec<(i32, i32)>; MM] = std::array::from_fn(|_| Vec::new());
这个方法会遍历数组的每一个索引位,每次执行闭包生成一个全新的空Vec,不存在值重复移动的问题。
推荐写法2:灵活场景用嵌套Vec
如果邻接表的大小不需要在编译期硬编码(比如大小是运行时读入的),更推荐直接用嵌套的Vec结构,初始化更简单,也是算法题里写邻接表最常用的写法:
let mm: usize = 100; // 支持运行时变量,不需要const修饰 let mut adj: Vec<Vec<(i32, i32)>> = vec![Vec::new(); mm];
注意:这里
vec!宏可以正常工作,是因为宏内部会对每个元素调用clone()生成独立实例,空Vec的clone成本极低,几乎没有额外开销。
避坑提醒
不要直接写如下代码:
// 编译失败!Vec没有实现Copy trait let mut adj: [Vec<(i32, i32)>; MM] = [Vec::new(); MM];
编译器会提示你Vec<(i32, i32)>类型不满足Copy约束,无法通过复制单个值初始化整个数组。
内容的提问来源于stack exchange,提问作者Blackgaurd
相关产品推荐
相关产品推荐

