ryn*_*n1x 5 iterator vector slice rust
我想将一个大向量分块成一个向量向量。我知道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]]
Run Code Online (Sandbox Code Playgroud)
与此类似的操作是分析后我程序中最慢的部分之一,我想知道如何改进它。
Pet*_*all 16
如果 aVec<Vec<i32>>是您真正想要的,那么这是一个很好的方法。任何其他方法(不包括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]]
Run Code Online (Sandbox Code Playgroud)
编辑:我确实在这里有一些额外的unsafe代码,可以将 a 转换Vec<i32>为 aVec<Vec<i32>>而无需重新分配。但有人指出,它仍然存在Undefined Behaviour,而且这个问题根本上是无法修复的