对不可变数组切片的引用的逆序
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
...
}
我想颠倒切片的顺序:
&[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
...
}