是否有更直接,更易读的方法来完成以下任务:
fn main() {
let a = [1, 2, 3];
let b = [4, 5, 6];
let c = [7, 8, 9];
let iter = a.iter()
.zip(b.iter())
.zip(c.iter())
.map(|((x, y), z)| (x, y, z));
}
Run Code Online (Sandbox Code Playgroud)
也就是说,如何从n个迭代中构建迭代器,从而产生n元组?
我正在编写一个库,它采用一种Vec<Vec<T>>类型以列主顺序存储数据(每个内部Vec代表一列)。用户可以创建Vec<Vec<T>>具有任意行和列长度的行和列,但所有列都被限制为相同的长度。
有时我需要有效地逐行迭代Vec<Vec<T>>。我不想更改数组类型,因为大多数时候我需要“按列向量”迭代(一次一个完整的列向量)。
除非我错过了一些东西,否则Iterator::zip不是一个选择,因为我事先不知道列向量的数量。Itertools::izip并且Itertools::multizip也不可行。
这是我的示例代码:
let array = vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]];
let mut iterators: Vec<_> = array.iter().map(|x| x.iter()).collect();
for _ in 0..array[0].len() {
let values: Vec<_> = iterators.iter_mut().map(|x| x.next().unwrap()).collect();
dbg!(values);
}
Run Code Online (Sandbox Code Playgroud)
我应该values在开始迭代之前定义一个可变向量以避免每个周期的分配,还是编译器会处理这种优化?自己找到它的最简单方法是什么?
有更有效/惯用的解决方案吗?