若值是向量的一部分,则移除该值,若是,则将其累加到另一个变量



我目前是这样做的:

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

很难说什么会更好。

最新更新