稳定替代collect_into -或-我如何收集一个大小的队列?



我有一些管道来操作一个迭代器到一个非常大的数据集,最后,我希望只保留N个最上面的值。

我写了一个围绕Vec的包装器-一个保存Vec及其最大大小的结构体,并实现插入,使Vec中的数据始终是有序的,太小的值将被忽略(也可以使用BTreeSet,如果N足够大)。

无论如何,我想我应该这样使用它:

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

但是我很失望地发现collect_into是不稳定的,并且有可能被删除,因为它可能被认为是不必要的,给出的理由是可以用不同的方法。

我的问题是-它怎么能做得不同(除了我只是实现一个Trait迭代器与此功能自己)?

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()

最新更新