是否可以在Vec <t>中找到一个元素并将其删除?

时间:2015-06-05 07:02:26

标签: vector rust

在Rust中,是否有一个用于查找和删除向量元素的内置函数,同时和单独的操作?

例如:

for f in factors {
    if f in list {
        list.remove(f);
    }
}

目前,防锈文档仍然有点令人困惑,所以虽然我的搜索没有显示,但我觉得其他人很可能找到它。

3 个答案:

答案 0 :(得分:8)

该示例可以写成:

let mut list = (0..10).collect::<Vec<u32>>();
list.retain(|element| element % 2 == 0);
assert_eq!(&list[..], &[0, 2, 4, 6, 8]);

相关文档可在此处找到:https://doc.rust-lang.org/std/vec/struct.Vec.html

答案 1 :(得分:4)

您总是可以使用into_iter()将Vec解构为迭代器,filter(..)将元素和collect()转换为新的Vec:

list.into_iter().filter(|e| !factors.contains(e)).collect();

您可能需要指定collect的类型(应该是Vec&lt; T &gt;其中 T 是元素的类型),除非您将其绑定到正确类型的变量。

编辑:根据A.B.的建议,你也可以写

list.retain(|e| !factors.contains(e))

请注意,两者都在O(L×F)范围内,其中L是list的len,F是factors的len。对于小L和/或F,这将没问题。否则,最好先将因子转换为HashSet。

答案 2 :(得分:2)

没有同时发现和删除&#34;方法,我知道。 Vec有:

  • remove是移除元素并移动所有后续元素以填补空白的一般方法
  • swap_remove删除此元素并将其替换为最后一个元素(避免所有移位,因此通常会更快)
  • pop删除最后一个元素(非常高效,如果你想删除Vec中间的元素,可能不是你需要的)
你可以做点什么:

let mut v = vec![1, 2, 3];
// iterate through the vector and return the position for the
// first element == 2. If something is found bind it to the name
// index
if let Some(index) = v.iter().position(|&i| i == 2) {
    v.remove(index); // remove the element at the position index (2)
}

println!("{:?}", v); // prints [1, 3]