我想要这样的方法:
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()
检查可以避免死机,而且实际上还可以改进程序集。