我想出了following function来换位成Vec<Vec<T>>:

fn transpose<T>(v: Vec<Vec<T>>) -> Vec<Vec<T>> {
    let mut xs = v.into_iter().map(|x| x.into_iter()).collect::<Vec<_>>();
    (0..)
        .map_while(|_| xs.iter_mut().map(|x| x.next()).collect())
        .collect()
}

(0..)未使用,但锚定迭代器.我可以把任何东西放在那里.但是,是否可以将其重构为不再有一个无用的迭代器?

推荐答案

您可以使用std::iter::from_fn:

创建新的迭代器,其中每个迭代调用所提供的闭包F: FnMut() -> Option<T>.

fn transpose<T>(v: Vec<Vec<T>>) -> Vec<Vec<T>> {
    let mut xs = v.into_iter().map(|x| x.into_iter()).collect::<Vec<_>>();
    std::iter::from_fn(|| xs.iter_mut().map(|x| x.next()).collect()).collect()
}

Rust相关问答推荐

如何最好地并行化修改同一Rust向量的多个切片的代码?

无法在线程之间安全地发送future (&Q;)&错误

在没有引用计数或互斥锁的情况下,可以从Rust回调函数内的封闭作用域访问变量吗?

为什么我不能从带有字符串的 struct 的引用迭代器中收集VEC<;&;str&>?

为什么BitVec缺少Serialize trait?

使用铁 rust S还原对多个数组执行顺序kronecker积

正则表达式中的重叠匹配?(铁 rust 正则式发动机)

完全匹配包含大小写的整数范围(&Q;)

对于rustc编译的RISC-V32IM二进制文件,llvm objdump没有输出

Rust 中多个 & 符号的内存表示

push 方法是否取得所有权?

按下 Ctrl + C 时优雅地停止命令并退出进程

如何在 Rust 中将枚举变体转换为 u8?

为什么不可变特征的实现可以是可变的?

bcrypt 有长度限制吗?

在构建器模式中捕获 &str 时如何使用生命周期?

为什么拥有 i32 所有权的函数需要它是可变的?

在 Rust 中退出进程

`if let` 只是另一种编写其他 `if` 语句的方式吗?

为什么 Rust 中的关联类型需要明确的生命周期注释?