我有两个HashSet<u16>
,我想实现a = a U b
。如果可能的话,我想使用HashSet::union
而不是循环或其他调整。
我尝试了以下操作:
use std::collections::HashSet;
let mut a: HashSet<u16> = [1, 2, 3].iter().cloned().collect();
let b: HashSet<u16> = [7, 8, 9].iter().cloned().collect();
// I can build a union object that contains &u16
let union: HashSet<&u16> = a.union(&b).collect();
// But I can't store the union into a
a = a.union(&b).collect(); // -> compile error
// of course I can do
for x in &b {
a.insert(*x);
}
// but I wonder if union could not be used to simply build a union
错误消息如下:
the trait bound
`std::collections::HashSet<u16>: std::iter::FromIterator<&u16>`
is not satisfied
如何执行a = a U a
?
答案 0 :(得分:3)
您不想要union
-如您所说,它将创建一个新的HashSet
。相反,您可以使用Extend::extend
:
use std::collections::HashSet;
fn main() {
let mut a: HashSet<u16> = [1, 2, 3].iter().cloned().collect();
let b: HashSet<u16> = [1, 3, 7, 8, 9].iter().cloned().collect();
a.extend(&b);
println!("{:?}", a);
}
Extend::extend
也是implemented for other collections,例如Vec
。 Vec
的结果会有所不同,因为Vec
不会像Set
那样重复复制。
答案 1 :(得分:-1)
// But I can't store the union into a
a = a.union(&b).collect(); // -> compile error
错误信息如下:
the trait bound `std::collections::HashSet<u16>:
std::iter::FromIterator<&u16>` is not satisfied
这是因为 a
是 HashSet<u16>
,而 a.union(&b)
是 Iterator<Item=&u16>
。使用 a.union(&b)
将 Iterator<Item=u16>
转换为 .copied()
有效:
a = a.union(&b).copied().collect(); // compiles
正如另一个提到的,这将创建一个新的 HashSet
。在某些情况下,这可能是您想要的,但如果将其分配给另一个变量会更有意义:
let c: HashSet<u16> = a.union(&b).copied().collect();
// a is unchanged here