我目前是这样做的:
// v is a vector with thousands of sorted unsigned int value.
let mut total = 0;
// [...]
// some loop
let a = 5;
if v.iter().any(|&x| x == a as u16) {
total += a;
v.retain(|&x| x != a as u16);
}
// end loop
但是它效率很低,因为我在v
上迭代了两次(尽管编译器可能会发现并优化(,用Rust不是更优雅的方法吗?
NB:矢量经过排序,如果有帮助,则不包含重复值
如果我正确理解您的请求,这里有一个解决方案:
- 您说您的向量已排序,因此可以使用
binary_search()
- 所以你可以使用
remove()
fn foo(data: &mut Vec<u16>) -> u64 {
let mut total: u64 = 0;
let mut a = 0;
while data.len() > 0 {
if let Ok(i) = data.binary_search(&a) {
total += data.remove(i) as u64;
}
a += 1;
}
total
}
fn main() {
let mut data = vec![1, 3, 8, 9, 46];
assert_eq!(foo(&mut data), 67);
}
这样可以在移除时保持向量的排序,注意这是一个伪示例。如果您不关心排序,可以使用swap_remove()
,但这不允许使用binary_search()
。
很难说什么会更好。