微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何有效地将切片复制到 Rust VecDeque 中

如何解决如何有效地将切片复制到 Rust VecDeque 中

我正在以流方式处理字节输入,如下所示:

pub struct CharQueue<R: Read> {
    reader: R,deque: VecDeque<u8>,buf: [u8;1024],}
self.deque.reserve_exact(bytes_read);
for i in 0..bytes_read {
    self.deque.push_back(self.buf[i]);
}

在分析中,VecDeque::cap() 似乎是运行时的主要贡献者。这令人惊讶,因为它除了返回一个变量(我猜还有分支)之外几乎什么都不做:

fn cap(&self) -> usize {
    if mem::size_of::<T>() == 0 {
        // For zero sized types,we are always at maximum capacity
        MAXIMUM_ZST_CAPACITY
    } else {
        self.buf.capacity()
    }
}

所以它必须被调用很多次(如果它在 push_back() 内被调用,它会被调用,事后看来这是很有意义的)。

我想知道是否有办法一次性将整个缓冲区复制到队列中,因此只需检查和增加一次容量。 .reserve_exact() 跳过中间分配,但不跳过检查和增量。 .append() 有点像这样,但我必须先使用缓冲区将其转换为另一个 VecDeque,我不想这样做,因为我想重用它。我真正想要的是像 push_back_slice() 这样的东西,它只需要一个切片,增加队列长度/进行任何所需的分配一次,然后将切片的每个元素直接复制到可用空间中,而不需要变异或消耗它。

有没有办法做到这一点?

解决方法

VecDeque 实现了 Extend 特性,允许您将迭代器中的所有项目添加到集合中,而无需执行重复分配或检查。使用您的代码,它应该如下所示:

self.deque.extend(bytes_read.iter().copied());

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。