我有一个由两个i32
类型组成的自定义Struct,它们组成了一个2D向量。我一直在使用for
循环访问某些索引,但我还没有弄清楚如何获得'col '或'row'的长度。下面是我的代码:
#[derive(Debug)]
pub struct Vec2d {
col: i32,
row: i32,
}
fn main() {
let mut vec_struct = Vec::new();
for i in 0..5 {
for j in 0..7 {
let index = [
Vec2d {
col: j * 3,
row: i * 5,
},
];
vec_struct.push(index);
}
}
// I want to get 5 or 7 somehow, but none of these two work
println!("{}", vec_struct[0][0].len());
println!("{}", vec_struct[0].len());
// This works, but prints both dimensions (output: 35)
println!("{}", vec_struct.len());
}
由于您将元素存储在平面Vec
中,因此您已经丢失了每列/行开始和结束的信息。
您可以将它们存储在嵌套的Vec<Vec<Vec2d>>
中,或者尝试恢复这些信息,并知道当列号为零时新列开始:
let columns = vec_struct
.iter()
.enumerate()
.skip(1) // The first column is always zero, skip it
.find_map(|(i, Vec2d { col, .. })| if *col == 0 { Some(i) } else { None })
.unwrap();
let rows = vec_struct.len() / columns;
您将元素存储在单元素数组([Vec2d { ... }]
)中。我猜你尝试了第一个解决方案,但这个数组总是保持一个元素大小。你需要使用这样的向量:
for i in 0..5 {
let mut row = Vec::new();
for j in 0..7 {
let index = Vec2d {
col: j * 3,
row: i * 5,
};
row.push(index);
}
vec_struct.push(row);
}
let rows = vec_struct.len();
let columns = vec_struct[0].len();