【发布时间】:2019-01-29 05:11:22
【问题描述】:
我想将一个大向量分块成一个向量向量。我知道chunks(),但不确定从迭代器到二维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]]
类似的操作是我的程序分析后最慢的部分之一,我想知道如何改进它。
【问题讨论】:
-
我没有发现问题。
-
您可以创建切片向量或编写/使用跨步数组类型。 有更好的方法吗? 是一个相当开放的问题。你能具体说明为什么这种方法不够好吗?
-
问题的范围很广。我想真正的问题是:表示二维向量的最佳方式是什么?恕我直言,解决方案是包装单个向量并添加一些方法将其抽象为 2D。
-
您将有 N + 2 个分配,其中 N 是
v_chuncked的元素数。通过返回 Vec 而不是 Vec>。见godbolt.org/z/4Z2iww。 -
作为一个新的 Rust 用户,我倾向于用 vec 的 vec 定义我的结构,因为我不知道在编译时要分块到其中的集合的确切大小。我知道它会有数百万个元素,但我需要执行数百次。我将探索切片方法的 vec。谢谢!
标签: vector rust iterator slice