use std::collections::HashSet;
let mut a: HashSet<T> = HashSet::new();
let mut b: HashSet<T> = HashSet::new();
let mut c: HashSet<T> = a.intersection(&b).collect();
// Error: a collection of type `std::collections::HashSet<T>` cannot be built from an iterator over elements of type `&T`
我不再需要不相交的值。我如何从集合a
和b
中窃取/移动数据到c
中而不进行复制或克隆?理想情况下,这将具有理论上最优的时间复杂度:O(min(a,B))的最小值。
4条答案
按热度按时间u5rb5r591#
编译器的别名规则要求你来回移动值。值可以从一个集合中被清空,尽管是无条件的。但是,如果我们跟踪哪些值应该被移动,哪些应该留在一个新的集合中,我们可以把某些值发送回去。然后,
retain
允许我们从第二个集合中删除公共值。使用:
Playground
n8ghc7c12#
另一个解决方案,similar to E_net4's,但这一个不涉及排放,然后重新填充第一集。IMHO它也稍微容易阅读。
Playground Link
写完这篇文章后,我意识到还可以做得更简单:
Playground Link
kdfy810k3#
或者,如果您可以取得集合本身的所有权,并且不在乎保留其他集合中的非相交值,则可以执行以下操作:
这将a中包含在B中的元素收集到一个新的HashSet中
cld4siwp4#
您也可以使用比特AND运算子: