如何比较两个std :: set?

时间:2013-04-24 03:39:25

标签: c++ set std

我对两个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

问题:

这是正确的方法吗?或者是比较两组的任何其他(特殊)方式?

4 个答案:

答案 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

作为简短摘要,以避免与其他答案重复:

  • 23.2.1“常规容器要求”规定,所有容器都将std::vector用于equal()
  • 25.2.11“等于”定义了operator==,并明确表明它在两个容器上进行了迭代,比较了每个容器的元素