在Rust中,是否有一个用于查找和删除向量元素的内置函数,同时和单独的操作?
例如:
for f in factors {
if f in list {
list.remove(f);
}
}
目前,防锈文档仍然有点令人困惑,所以虽然我的搜索没有显示,但我觉得其他人很可能找到它。
答案 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有:
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]