Vector 检查Vec是否包含来自其他Vec的所有元素

Vector 检查Vec是否包含来自其他Vec的所有元素,vector,collections,rust,Vector,Collections,Rust,有一种方法可用于检查Vec中是否存在特定元素。如何检查一个Vec中的所有元素是否包含在另一个Vec中?还有比手动迭代和显式检查所有元素更简洁的方法吗?您还可以对向量进行排序,然后测试它们是否相等: fn main() { let mut v1 = vec![2, 3, 1]; let mut v2 = vec![3, 1, 2]; v1.sort(); v2.sort(); assert_eq!(v1, v2); } 您有两个主要选择: 天

有一种方法可用于检查
Vec
中是否存在特定元素。如何检查一个
Vec
中的所有元素是否包含在另一个
Vec
中?还有比手动迭代和显式检查所有元素更简洁的方法吗?

您还可以对向量进行排序,然后测试它们是否相等:

fn main() {
    let mut v1 = vec![2, 3, 1];
    let mut v2 = vec![3, 1, 2];
    
    v1.sort();
    v2.sort();

    assert_eq!(v1, v2);
}

您有两个主要选择:

  • 天真地检查一个向量中的每个元素,看看它是否在另一个向量中。这具有时间复杂度O(n^2),但也非常简单且开销较低:

    assert!(b.iter().all(|item| a.contains(item)));
    
  • 创建其中一个向量的所有元素的集合,然后检查其中是否包含另一个向量的元素。这具有O(n)时间复杂性,但包括额外堆分配在内的更高开销:

    let a_set: HashSet<_> = a.iter().copied().collect();
    assert!(b.iter().all(|item| a_set.contains(item)));
    
    let a_set:HashSet=a.iter().copied().collect();
    断言!(b.iter().all(| item | a|u set.contains(item));
    
哪一个更好取决于你的要求。如果您只关心速度,那么更好的选择仍然取决于向量中元素的数量,因此您应该使用真实的数据来测试这两种情况。您还可以使用
b树集
进行测试,该树集与
哈希集
具有不同的性能特征


下面是一些粗略的基准测试()说明了实现如何随输入的大小而变化。在所有测试中,
b
a
的一半大小,并且包含
a
元素的随机子集:

a的大小
Vec::contains
HashSet::contains
BtreeSet::contains
10 14 386 327 100 1,754 3,187 5,371 1000 112,306 31,233 88,340 10000 2,821,867 254,801 728,268 100000 29,207,999 2,645,703 6,611,666
看起来还不错。另一种选择是在or中加载,并使用is\u子集/is\u超集。这将有更高的常量开销,但它应该是线性的,而不是二次的,如果集合相当大,这可能是个好主意。@mcarton实际上,但我使用过的几乎所有语言都有现成的东西。所以我问,万一我漏掉了什么东西,有什么方法可以解决这个问题。真的吗?我不知道有哪种语言支持开箱即用的向量数据结构的子集检查。对于集合数据结构,当然可以,但不是向量。@SvenMarnach至少要注意,他们询问的是子集,而不仅仅是相等,例如,
v1
可能只有
1
3
,但不是
2