在Rust中使用迭代器循环不同大小的数组

ibrsph3r  于 2022-12-19  发布在  其他
关注(0)|答案(2)|浏览(129)

我有一个包含两个大小不同的向量的向量:

let vectors = vec![
    vec![0, 1],
    vec![2, 3, 4]
];

我想创建一个迭代器来循环遍历每个向量的元素,返回:

0: [0, 2]
1: [1, 3]
2: [0, 4]
3: [1, 2]
...

在这个例子中有两个向量,但是我想把它推广到k个向量。
我已经试过了:

let cycles = vectors
    .into_iter()
    .map(|x| x.into_iter().cycle());

loop {
    let output: Vec<_> = cycles
        .map(|x| x.next().unwrap())
        .collect();
}

但是,它不起作用,因为x不能作为可变的借用。

error[E0596]: cannot borrow `x` as mutable, as it is not declared as mutable
  --> src/main.rs:14:22
   |
14 |             .map(|x| x.next().unwrap())
   |                   -  ^^^^^^^^ cannot borrow as mutable
   |                   |
   |                   help: consider changing this to be mutable: `mut x`

我理解这个错误,但是我想不出构建这个迭代器的替代方法。Playground

vlju58qv

vlju58qv1#

您必须将迭代器收集到某个数据结构中,如Vec
然后,可以使用iter_mut迭代可变引用,这使您可以推进收集的迭代器。

fn main() {
    let vectors = vec![vec![0, 1], vec![2, 3, 4]];
    let mut cycles = vectors
        .into_iter()
        .map(|x| x.into_iter().cycle())
        .collect::<Vec<_>>();
    for i in 0.. {
        let output: Vec<_> = cycles.iter_mut().map(|x| x.next().unwrap()).collect();
        println!("{i}: {output:?}");
    }
}
qzwqbdag

qzwqbdag2#

你的意思是:

0: [0, 2]
1: [1, 3]
2: [0, 4]
3: [1, 2] <- was 3
...

如果是:

let vectors: Vec<Vec<u8>> = vec![vec![0, 1], vec![2, 3, 4]];
let mut cycles: Vec<_> = vectors.iter().map(|x| x.iter().cycle()).collect();

for i in 0..4 {
    let output: Vec<_> = cycles.iter_mut().map(|x| x.next().unwrap()).collect();
    println!("{i}: {output:?}");
}

相关问题