我对两个std::set
做了这样的比较
#include <cstdlib>
#include <cstdio>
using namespace std;
#include <vector>
#include <set>
int main(int argc, char** argv)
{
int myints1[]= {10,20,30,40,50};
int myints2[]= {50,40,30,20,10};
std::set<int> s1 (myints1,myints1+5);
std::set<int> s2(myints2,myints2+5);
if(s1==s2){
printf("sets: true");
}else printf("sets: false");
std::set<int>::iterator it2=s2.begin();
for(std::set<int>::iterator it1=s1.begin();it1!=s1.end();it1++){
printf("\ns1: %d s2: %d",*it1,*it2);
it2++;
}
}
输出:
sets: true
s1: 10 s2: 10
s1: 20 s2: 20
s1: 30 s2: 30
s1: 40 s2: 40
s1: 50 s2: 50
- 问题:**
这是正确的方法吗?或者是任何其他(特殊的)比较两组的方法吗?
5条答案
按热度按时间khbbv19g1#
是的,
operator==
对于所有标准容器都是正确定义的(除了无序容器-23.2.5.2基于标准的www.example.com),并且通常会进行字典顺序比较。例如,请参见here。检查lhs和rhs的内容是否相等,即lhs.size()== rhs.size()和lhs中的每个元素在rhs中的相同位置是否有等价的元素。
由于
std::set
是有序容器,任何具有相同大小和相同元素的集合(假定比较器相同)将必然使它们处于相同位置,因此将比较为相等。mfpqipee2#
在C++标准库头
<algorithm>
中有几个集合操作。std::set_difference
给出了在集合1中但不在集合2中的那些元素。std::set_intersection
给出了在两个集合中的那些元素。std::set_symmetric_difference
给出了出现在其中一个集合而不是两个集合中的那些元素。std::set_union
给出了在集合1或集合2中的那些元素。上面的算法也可以应用于除
std::set
之外的STL容器,但是容器必须首先排序(默认情况下排序std::set
)。jtoj6r0c3#
另一种方法是这样的:
灵感来自优雅的答案here。
jvlzgdj94#
==
上的C++11标准用于std::set
其他have mentioned,
operator==
确实比较std::set
的内容和作品,但这里有一个引用C++11 N3337 standard draft,我相信这意味着。该报价与
std::vector
的报价完全相同,我已在以下网址详细解释了该报价:C++:比较两个向量为了避免与其他答复重复,现作简短总结:
equal()
代替operator==
equal
,并显式地显示了它在两个容器上迭代,比较每个容器的元素2eafrhcq5#
在C++11或更高版本中,您可以使用
==
来比较两个集合是否相等。此外,您还可以使用
==
来比较2无序集。只要键相同,大小也相同,容器就会相等**,无论键的顺序如何。**