如何比较两个std :: set?

32 c++ std set

我比较两个 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++;
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

sets: true
s1: 10  s2: 10
s1: 20  s2: 20
s1: 30  s2: 30
s1: 40  s2: 40
s1: 50  s2: 50
Run Code Online (Sandbox Code Playgroud)

题:

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

Yuu*_*shi 42

是的,operator==正确定义了所有标准容器(无序容器除外 - 基于标准的23.2.5.2),并且通常会进行字典比较.例如,请参见此处.相关报价:

检查lhs和rhs的内容是否相等,即lhs.size()== rhs.size()和lhs中的每个元素在同一位置的rhs中是否具有等效元素.

由于std::set是一个有序的容器,任何具有相同大小和相同元素的集合(给定比较器是相同的)必然会将它们放在相同的位置,因此将比较相等.

  • @gumtree`std :: set`不会按插入顺序保留元素.它排序他们.因此,迭代将像`==`works(和`std :: equal`也以同样的方式工作)一样工作. (7认同)
  • 无序容器也有`operator ==`(参见[here](http://www.cplusplus.com/reference/unordered_set/unordered_set/operators/)或更好,[这里](http://en.cppreference.com/W/CPP /容器/ unordered_set/operator_cmp)) (3认同)

WiS*_*GaN 21

C++标准库头中有几个set操作<algorithm>.

std::set_difference 给出第1组但不是第2组的元素.

std::set_intersection 给出两组中的元素.

std::set_symmetric_difference 给出那些出现在其中一个集合中的元素,但不是两个集合.

std::set_union 给出集合1或集合2中的元素.

上述算法也可以应用于除STL之外的STL容器std::set,但容器必须先排序(std::set默认排序).


Ris*_*rti 5

另一种方式是这样的:

template<typename Set>

bool set_compare(Set const &lhs, Set const &rhs){
    return lhs.size() == rhs.size() 
        && equal(lhs.begin(), lhs.end(), rhs.begin());
}
Run Code Online (Sandbox Code Playgroud)

灵感来自这里优雅的答案。