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)
根据您的示例,您似乎正在寻找元素唯一的向量。
向量实际上并不保证此属性(项目不必是唯一的或有序的,实际上,它们甚至不必支持比较),但集合可以(HashSet或BTreeSet)。并且 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)
| 归档时间: |
|
| 查看次数: |
6175 次 |
| 最近记录: |