我有两个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 b
?
3条答案
按热度按时间ego6inou1#
您不需要
union
-正如您所说,它将创建一个新的HashSet
。(Playground)
Extend::extend
也可以为其他集合实现,例如Vec
。Vec
的结果会有所不同,因为Vec
不像Set
那样支持重复项。h6my8fg22#
错误消息如下所示:
因为
a
是HashSet<u16>
,而a.union(&b)
是Iterator<Item=&u16>
,使用.copied()
将a.union(&b)
转换为Iterator<Item=u16>
的工作原理是:正如前面提到的,这将创建一个新的
HashSet
,在某些情况下,这可能是你想要的,但如果它被赋给另一个变量,它会更有意义:h43kikqp3#
要收集多个哈希集:
Playground:https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=44cd73eb3a4e628378cbb7ff11a32649