我对两个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
问题:
这是正确的方法吗?或者是比较两组的任何其他(特殊)方式?
答案 0 :(得分:40)
是的,operator==
已正确定义所有标准容器(除了无序容器 - 基于标准的23.2.5.2),并且通常会进行字典比较。请参阅示例here。相关引用:
检查lhs和rhs的内容是否相等,即lhs.size()== rhs.size()和lhs中的每个元素在同一位置的rhs中是否具有等效元素。
由于std::set
是一个有序的容器,任何具有相同大小和相同元素的集合(给定比较器都是相同的)必然会将它们放在相同的位置,因此将比较相等。
答案 1 :(得分:20)
C ++标准库标题<algorithm>
中有几个集合操作。
std::set_difference
给出了第1组但未设置为2的元素。
std::set_intersection
给出了两组中的元素。
std::set_symmetric_difference
提供出现在其中一个集合中的元素,但不是两个集合。
std::set_union
给出了集合1或集合2中的元素。
上述算法也可以应用于std::set
以外的STL容器,但容器必须先排序(std::set
默认排序)。
答案 2 :(得分:1)
另一种方式是:
template<typename Set>
bool set_compare(Set const &lhs, Set const &rhs){
return lhs.size() == rhs.size()
&& equal(lhs.begin(), lhs.end(), rhs.begin());
}
灵感来自优雅的答案here。
答案 3 :(得分:0)
==
上std::set
的C ++ 11标准
其他have mentioned确实比较了operator==
的内容和作品,但这是C++11 N3337 standard draft的引文,我相信这是暗示。
报价与std::set
的报价完全相同,我在以下网址对此进行了详细解释:C++: Comparing two vectors
作为简短摘要,以避免与其他答案重复:
std::vector
用于equal()
operator==
,并明确表明它在两个容器上进行了迭代,比较了每个容器的元素