C ++对unordered_set和set的set_intersection方法的结果不一致

问题描述

当我遇到unordered_setset的不一致时,我正在研究Leetcode的问题。 设两个向量为nums1 = [4,9,5]nums2 = [9,4,8,4]。我们必须找到它们的交点,所以我做了以下两件事:

1。

unordered_set<int> s1 (nums1.begin(),nums1.end());
unordered_set<int> s2 (nums2.begin(),nums2.end());
vector <int> s;
set_intersection(s1.begin(),s1.end(),s2.begin(),s2.end(),back_inserter(s));

2。将unordered_set替换为set

set<int> s1 (nums1.begin(),nums1.end());
set<int> s2 (nums2.begin(),back_inserter(s));

方法1的结果为[9],而方法2的结果为[9,4](正确)。我是否缺少C ++ STL的一些关键概念?

解决方法

在第一个片段中,由于原始集合未排序,因此仅返回第一个相交范围

构造一个以d_first开头的,由元素组成的排序范围 在排序的范围[first1,last1)和[first2, last2)。如果在[first1,last1)和n中发现m次 在[first2,last2)中的时间, first std :: min(m,n)元素将为 从第一个范围复制到目标范围。

第一个排序范围是{4,9},第二个排序范围是{9}。 这两个的交叉点的确是{9}。

对于set,{4,9}和{9,4}相等,并且set是排序范围。因此,这两个结果对于给定范围都是正确的。