有效地保留一系列vec元素



我想要这样的方法:

trait RetainRange {
fn retain_range(&mut self, range: std::ops::Range<usize>);
}
impl<T> RetainRange for Vec<T> {
fn retain_range(&mut self, range: std::ops::Range<usize>) {
// Retain only the elements within the given range.
let mut i = 0usize;
self.retain(|el| {
let r = range.contains(&i);
i += 1;
r
});
}
}

但是每次调用lambda和range.contains()似乎效率很低。有更好的方法吗?

此代码生成看起来更高效的程序集。

fn retain_range(&mut self, range: std::ops::Range<usize>) {
self.truncate(range.end);
if range.start < self.len() {
self.drain(0..range.start);
} else {
self.clear();
}
}

如果范围超过Vec的末尾,则添加if range.start < self.len()检查可以避免死机,而且实际上还可以改进程序集。

最新更新