【发布时间】:2019-02-18 22:14:30
【问题描述】:
我正在编写一个库,它采用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);
}
我应该在开始迭代之前定义一个可变的values 向量以避免在每个周期进行分配,还是编译器会处理这种优化?自己找到最简单的方法是什么?
是否有更有效/惯用的解决方案?
【问题讨论】:
-
我认为你混淆了行和列,另见docs.rs/ndarray/0.12.1/ndarray/struct.ArrayBase.html
-
我不认为有一个聪明的方法可以做到这一点,如果你的向量向量很大,即使将它转换为一个向量也不会提高缓存性能,最好改变你的算法不需要此功能或反转数据中的行和列。没有准确的真实情况是不可能给出正确解决方案的。
-
看来你可以用
Itertools::kmerge_by做点什么? -
一旦我将
iterators定义为迭代器向量,有没有聪明的方法将其转换为向量迭代器?
标签: rust