是否有内置函数来计算两个集合的差异?

Dan*_*hen 11 set rust

Rust 新手。很简单的问题,查了好久没找到答案

基本上我想要这样的东西

let mut v1 = vec![0, 1, 2, 3, 4];
let mut v2 = vec![3, 4];
assert_eq!(v1 - v2, &[0, 1, 2]);

let mut v1 = vec![0, 1, 2, 3, 4, 5, 6];
let mut v2 = vec![3, 4];
assert_eq!(v1 - v2, &[0, 1, 2, 5, 6]);

let mut v1 = vec![0, 1, 2, 3, 4, 5, 6];
let mut v2 = vec![7];
assert_eq!(v1 - v2, &[0, 1, 2, 3, 4, 5, 6]);
Run Code Online (Sandbox Code Playgroud)

Pau*_*aul 9

根据您的示例,您似乎正在寻找元素唯一的向量。

向量实际上并不保证此属性(项目不必是唯一的或有序的,实际上,它们甚至不必支持比较),但集合可以(HashSetBTreeSet)。并且 HashSet 确实支持该-运算符:

游乐场链接

use std::collections::HashSet;

fn main() {
    let s1: HashSet<i32> = [0, 1, 2, 3, 4].iter().cloned().collect();
    let s2: HashSet<i32> = [3, 4].iter().cloned().collect();
    let expected: HashSet<i32> = [0, 1, 2].iter().cloned().collect();
    assert_eq!(&s1 - &s2, expected);
}

Run Code Online (Sandbox Code Playgroud)

如果你想对向量执行此操作,你可以转换为 HashSet 或 BTreeSet,然后从中创建一个向量:

fn vect_difference(v1: &Vec<i32>, v2: &Vec<i32>) -> Vec<i32> {
    let s1: HashSet<i32> = v1.iter().cloned().collect();
    let s2: HashSet<i32> = v2.iter().cloned().collect();
    (&s1 - &s2).iter().cloned().collect()
}
Run Code Online (Sandbox Code Playgroud)

或者您可以直接对向量执行差异(请记住,这是一个 O(N*M) 算法,如果两个向量都很长,则性能会很差):

fn vect_difference(v1: &Vec<i32>, v2: &Vec<i32>) -> Vec<i32> {
    v1.iter().filter(|&x| !v2.contains(x)).cloned().collect()
}
Run Code Online (Sandbox Code Playgroud)