我想将一个大的矢量分块为矢量矢量。我知道chunks(),但我不确定从迭代器到2D Vec的最佳方法。我找到了以下工作,但有没有更好的方法来写这个?
let v: Vec<i32> = vec![1,1,1,2,2,2,3,3,3];
let v_chunked: Vec<Vec<i32>> = v.chunks(3).map(|x| x.to_vec()).collect();
println!("{:?}", v_chunked); // [[1, 1, 1], [2, 2, 2], [3, 3, 3]]
更新:最初的问题有点宽泛。类似于上面的例子的操作是我的程序在分析后最慢的部分之一,我想知道如何改进它。在评论的帮助下,我发现在我的结构中将数据存储为1D vec更加高效。然后为了方便地处理它我使用块并使用数据在函数体内根据需要使用切片的vec。
如果Vec<Veci32>>
是你真正想要的,那么这是一个非常好的方法。任何其他方法(不包括unsafe
代码,见下文)不太可能明显更快或使用明显更少的内存。无论实际代码如何,每个嵌套的Vec
都是一个新的内存分配,所有数据都需要复制 - 而这基本上就是你的代码所做的一切。
表示像这样的2D结构的更“生锈”的方式是在原始数据中切片的Vec
。这样您就不会进行任何复制,也不会进行新的分配。
let v_slices: Vec<&[i32]> = v.chunks(3).collect();
println!("{:?}", v_slices); // [[1, 1, 1], [2, 2, 2], [3, 3, 3]]
编辑:我确实有一个extra bit这里有一些unsafe
代码,可以将Vec<i32>
转换为Vec<Vec<i32>>
而无需重新分配。但是,有人指出它仍然有未定义的行为,问题基本上是not fixable