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

Reverse order of a reference to immutable array slice

我想颠倒切片的顺序:

&[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 ()
         ...
    ...
 }

data 参数来自我使用 FileBuffer 读取的文件,我想将其保留为引用切片(而不是将其变成拥有的 Vec, 因为计算量很大)。

如何用最少的操作和内存分配来颠倒 cur_data 的顺序?它的长度对于我的程序的特定运行时间(此处称为 chunk_size)是已知的,但它在不同的运行时间之间会发生变化。 reversed() 似乎 return (),这是有道理的,因为它是就地完成的,而且我只有一个引用切片。 .iter().rev() 创建了一个迭代器,但是我不得不多次调用 .next() 来取回切片,这既不优雅又无效,因为我至少有数千万个每个文件 cur_data 行。

不仅reverse return (),它还需要一个可变切片,而你没有。最佳解决方案完全取决于您需要对数据执行的操作。如果你只需要遍历数据,cur_data.iter().rev() 是最正确和最高效的选择。

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

let mut reversed = vec![];
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
     ...
}