如何转置 Rust 中的向量向量?

dit*_*lav 0 vector rust

所以我有一个Vec<Vec<T>>第一个向量按天数分组,内部向量按天数分组。我想以某种方式转置向量,先按天再按小时。有没有一种简单的方法可以在 Rust 中做到这一点?

编辑:我的意思是,我知道如何用 2 个 for 循环来做,但是有没有更智能/更短的方法来实现它的功能

Net*_*ave 5

您可以使用一些迭代器:

fn transpose<T>(v: Vec<Vec<T>>) -> Vec<Vec<T>>
where
    T: Clone,
{
    assert!(!v.is_empty());
    (0..v[0].len())
        .map(|i| v.iter().map(|inner| inner[i].clone()).collect::<Vec<T>>())
        .collect()
}
Run Code Online (Sandbox Code Playgroud)

作为user4815162342评论,这是一个没有的版本Clone

fn transpose2<T>(v: Vec<Vec<T>>) -> Vec<Vec<T>> {
    assert!(!v.is_empty());
    let len = v[0].len();
    let mut iters: Vec<_> = v.into_iter().map(|n| n.into_iter()).collect();
    (0..len)
        .map(|_| {
            iters
                .iter_mut()
                .map(|n| n.next().unwrap())
                .collect::<Vec<T>>()
        })
        .collect()
}
Run Code Online (Sandbox Code Playgroud)

操场

  • 由于值的数量相同,因此最好有一个不需要“T:克隆”的版本 - 也许可以通过耗尽内部向量来实现。 (2认同)