Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vector 有效地将大向量分块为向量向量_Vector_Rust_Iterator_Slice - Fatal编程技术网

Vector 有效地将大向量分块为向量向量

Vector 有效地将大向量分块为向量向量,vector,rust,iterator,slice,Vector,Rust,Iterator,Slice,我想把一个大向量分成一个向量向量。我知道chunks(),但不确定从迭代器到2DVec的最佳方式。我发现下面的方法很有效,但是有没有更好的方法来写呢 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); //

我想把一个大向量分成一个向量向量。我知道
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]]
让v:Vec=Vec![1, 1, 1, 2, 2, 2, 3, 3, 3];
让v|u chunked:Vec=v.chunks(3).map(|x | x.to_Vec()).collect();
普林顿!(“{:?}”,v_分块);//[[1, 1, 1], [2, 2, 2], [3, 3, 3]]

类似于此的操作是评测后我程序中最慢的部分之一,我想知道如何改进它。

如果您真正想要的是
Vec
,那么这是一种非常好的方法。任何其他方法(不包括
不安全的
代码,见下文)都不太可能明显更快或使用更少的内存。不管实际的代码是什么,每个嵌套的
Vec
都是一个新的内存分配,所有的数据都需要被复制,这就是您的代码所做的一切

像这样表示2D结构的一种更“生疏”的方法是将切片
Vec
放入原始数据中。这样,您就不会进行任何复制,也不会进行新的分配

let v_slices: Vec<&[i32]> = v.chunks(3).collect();

println!("{:?}", v_slices); // [[1, 1, 1], [2, 2, 2], [3, 3, 3]]
让v_切片:Vec=v.chunks(3.collect();
普林顿!(“{:?}”,v_切片);//[[1, 1, 1], [2, 2, 2], [3, 3, 3]]


编辑:我确实有一个带有一些
不安全的
代码的here,它可以将
Vec
转换为
Vec
,而无需重新分配。然而,有人指出,它仍然有未定义的行为,问题根本在于

在注释的帮助下,我发现将数据存储为1D
Vec
更有效。然后,为了方便地处理它,我使用
,并根据需要在函数体中使用数据处理切片的
向量

我看不出问题。您可以创建切片向量或写入/使用跨步数组类型。有更好的办法吗?这是一个相当悬而未决的问题。你能具体说明一下为什么这种方法不够好吗?问题是如何将其推广到更广泛的领域。我想真正的问题是:什么是表示2D向量的最佳方式?解决方案IMHO需要包装单个向量,并添加一些方法将其抽象为2D。您将有N+2个分配,其中N是
v\u chuncked
的元素数。通过返回Vec而不是Vec,您只能有2个分配。请参阅。作为一个新的Rust用户,我倾向于使用vec中的vec来定义我的结构,因为我不知道编译时要分块到其中的集合的确切大小。我知道它将包含数百万个元素,但我需要执行数百次。我将探讨切片的向量向量机方法。谢谢