铁锈有效地将大块矢量大块放入矢量矢量

问题描述 投票:1回答:1

我想将一个大的矢量分块为矢量矢量。我知道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]]

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=5031d4d0e43470242b8304d483967a25

更新:最初的问题有点宽泛。类似于上面的例子的操作是我的程序在分析后最慢的部分之一,我想知道如何改进它。在评论的帮助下,我发现在我的结构中将数据存储为1D vec更加高效。然后为了方便地处理它我使用块并使用数据在函数体内根据需要使用切片的vec。

vector rust iterator slice
1个回答
1
投票

如果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

© www.soinside.com 2019 - 2024. All rights reserved.