gpt4 book ai didi

rust - 是否有内置函数来计算两组的差异?

转载 作者:行者123 更新时间:2023-12-03 11:28:52 26 4
gpt4 key购买 nike

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]);

最佳答案

根据您的示例,您似乎正在寻找元素唯一的向量。
向量实际上并不保证这个属性(项目不必是唯一的或有序的,事实上,它们甚至不必支持比较),但集合可以( HashSetBTreeSet )。而HashSet确实支持-运算符(operator):
( playground link )

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);
}

如果要对向量执行此操作,可以转换为 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()
}
或者您可以直接在向量上执行差异(请记住,这是一个 O(N*M) 算法,如果两个向量都很长,则性能会很差):
fn vect_difference(v1: &Vec<i32>, v2: &Vec<i32>) -> Vec<i32> {
v1.iter().filter(|&x| !v2.contains(x)).cloned().collect()
}

关于rust - 是否有内置函数来计算两组的差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63557089/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com