我想要这样的方法:
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();
}
}
如果范围超出了if range.start < self.len()
的末尾,则添加Vec
检查可以避免出现 panic ,并且实际上还可以提高汇编性。
关于vector - 有效保留一系列vec元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65004178/