Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.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
Rust 对不可变数组切片的引用的逆序_Rust_Borrow Checker - Fatal编程技术网

Rust 对不可变数组切片的引用的逆序

Rust 对不可变数组切片的引用的逆序,rust,borrow-checker,Rust,Borrow Checker,我想反转切片的顺序: &[1, 2, 3] -> &[3, 2, 1] 这是我的代码: fn iterate_over_file(data: &[u8], ...) -> ... { ... for cur_data in data.chunks(chunk_size) { let reversed_cur_data = cur_data.reverse() // this returns () ...

我想反转切片的顺序:

&[1, 2, 3] -> &[3, 2, 1]
这是我的代码:

fn iterate_over_file(data: &[u8], ...) -> ... {
    ...
    for cur_data in data.chunks(chunk_size) {
         let reversed_cur_data = cur_data.reverse() // this returns ()
         ...
    ...
 }
这个
数据
参数来自我在使用中读取的一个文件,我希望将其保留为一个引用切片(不要将其转换为一个拥有的
向量
,因为这是一个繁重的计算)


如何用最少的操作量和内存分配来反转当前数据的顺序?它的长度已知于我的程序的特定运行时(这里称为
chunk\u size
),但它在不同的运行期间会发生变化
reversed()
似乎返回
()
,这很有意义,因为它是在适当的位置执行的,我只有一个引用的片段
.iter().rev()
创建了一个迭代器,但是我必须对它调用几次
.next()
,以获取切片,这既不优雅也不有效,因为我每个文件至少有数千万行
cur_数据。
不仅
反向
返回
,它还需要一个您没有的可变切片。最佳解决方案取决于您需要对数据做什么。如果您只需要迭代数据,
cur_data.iter().rev()
正是正确且最有效的选择

如果需要片内的反转数据进行进一步处理,或将反转块发送给需要片的函数,则可以将数据收集到向量中,该向量在循环迭代中预先分配和共享,以避免为每个块分配:

let mut reversed = Vec::new();
for cur_data in data.chunks(chunk_size) {
     // truncate the slice at the beginning of each iteration.
     // Vec explicitly guarantees that this will *not* deallocate,
     // it will only reset its internal length. An allocation will
     // thus happen only at the first loop iteration.
     reversed.truncate(0);
     reversed.extend(cur_data.iter().rev());
     // &reversed is now the reversed_cur_data you need
     ...
}

我想知道
v.extend(iter.rev)
vs
v.extend(iter);v、 rev()。“后一种感觉似乎更冷,”谢普马斯特我有完全相反的感觉:)所以我决定测量。在我的机器上,当切换到
v.extend()时,执行大约需要1.02s;v、 rev()
需要约1.25秒。(使用
extend\u from_slice()
没有任何区别。)至少在当前的编译器中,我的直觉似乎是正确的
v.extend(iter.rev())
读取数据一次(按相反顺序),然后写入一次。另一方面,
v.extend(iter);v、 reverse()
必须在数据上迭代两次:一次复制数据,然后再次反转数据。理想情况下,
rustc
会找出发生了什么,并为两者生成相同的代码(就像它已经为
extend\u from\u slice
vs
extend
),但我想我们还没有做到。