Rust中如何获取自定义Vec2d结构体对应的行列维度长度
问题根因
你的代码没有实现真正的二维分层存储,自然无法直接获取独立的行/列长度:
vec_struct的实际类型是Vec<[Vec2d; 1]>:内层循环每次创建的是长度固定为1的数组,仅包含1个Vec2d实例,之后直接把这个长度1的数组push到外层动态数组中- 最终外层数组总长度是5*7=35,和你打印的总元素数完全吻合,全程没有做行、列的层级拆分
vec_struct[0][0]拿到的是Vec2d结构体实例,该类型没有实现len()方法,编译直接报错;vec_struct[0]拿到的是长度为1的固定数组,就算调用len()也只会返回固定值1,不可能得到你预期的列数7。
修复方案
方案1:使用嵌套动态数组实现二维结构
用外层Vec存行,每个行元素是存对应列数据的内层Vec,两层都是动态长度集合,可以直接调用len()拿到对应维度值:
#[derive(Debug)] pub struct Vec2d { col: i32, row: i32, } fn main() { // 声明嵌套Vec:外层元素为每行的列数据集合 let mut vec_struct: Vec<Vec<Vec2d>> = Vec::new(); for i in 0..5 { let mut current_row = Vec::new(); for j in 0..7 { current_row.push(Vec2d { col: j * 3, row: i * 5, }); } vec_struct.push(current_row); } println!("行数:{}", vec_struct.len()); // 输出5 println!("列数:{}", vec_struct[0].len()); // 输出7 }
方案2:扁平化存储+独立存维度值
如果追求内存连续的访问性能,可以把所有元素存在一维数组里做扁平化存储,单独把行列维度值和数据绑定存放,不需要靠嵌套结构推导维度:
#[derive(Debug)] pub struct Vec2d { col: i32, row: i32, } // 二维存储结构,绑定维度信息和底层数据 struct Vec2dCollection { row_count: usize, col_count: usize, data: Vec<Vec2d> } impl Vec2dCollection { fn new(row_count: usize, col_count: usize) -> Self { let mut data = Vec::with_capacity(row_count * col_count); for i in 0..row_count { for j in 0..col_count { data.push(Vec2d { col: (j * 3) as i32, row: (i * 5) as i32, }) } } Self { row_count, col_count, data } } } fn main() { let vec_2d = Vec2dCollection::new(5,7); println!("行数:{}", vec_2d.row_count); // 输出5 println!("列数:{}", vec_2d.col_count); // 输出7 println!("总元素数:{}", vec_2d.data.len()); // 输出35 }
注意点
Rust中固定长度数组[T; N]的长度是编译期确定的常量,调用len()永远返回常量N,如果你需要动态获取运行时的维度长度,必须使用Vec<T>这类动态长度集合,或者单独存储维度值。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

