rust collect_into的稳定替代方案-或者-如何收集大小合适的队列?

gr8qqesn  于 2023-01-21  发布在  其他
关注(0)|答案(1)|浏览(108)

我有一个管道,它可以操作一个迭代器,处理一个非常大的数据集,最后,我希望只保留N个最大的值。
我写了一个Vec的 Package 器--一个保存Vec及其最大大小的结构体,并实现了插入,使得Vec中的数据总是有序的,太小的值会被忽略(如果N足够大,也可以使用BTreeSet)。
不管怎样,我想我会这样使用它:

let mut q = SizedQueue(5);
<my iterator pipleline>.collect_into(&mut q);

但我失望地发现collect_into是不稳定的,并且可能会因为认为它是不必要的而被丢弃,给出的原因是可以用不同的方法来完成它。
我的问题是--如何才能做得不同(除了我自己用这个功能实现一个Trait for Iterator之外)?

lyfkaqu1

lyfkaqu11#

collect_into()只是调用Extend::extend()的一个方便快捷方式:

let mut q = SizedQueue(5);
q.extend(<my iterator pipleline>);

当然,您需要为您的类型实现Extend,一个简单的实现可能如下所示:

impl<T: PartialOrd> Extend<T> for SizedQueue<T> {
    fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
        for item in iter {
            self.push(item);
        }
    }
}

但是如果这只用于一个调用extend()的站点,那么您也可以直接内联它,然后循环和push()

相关问题