c++ 如何比较两个std::set?

l7mqbcuq  于 2022-12-27  发布在  其他
关注(0)|答案(5)|浏览(397)

我对两个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
    • 问题:**

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

khbbv19g

khbbv19g1#

是的,operator==对于所有标准容器都是正确定义的(除了无序容器-23.2.5.2基于标准的www.example.com),并且通常会进行字典顺序比较。例如,请参见here
检查lhs和rhs的内容是否相等,即lhs.size()== rhs.size()和lhs中的每个元素在rhs中的相同位置是否有等价的元素。
由于std::set是有序容器,任何具有相同大小和相同元素的集合(假定比较器相同)将必然使它们处于相同位置,因此将比较为相等。

mfpqipee

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)。

jtoj6r0c

jtoj6r0c3#

另一种方法是这样的:

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

jvlzgdj9

jvlzgdj94#

==上的C++11标准用于std::set

其他have mentionedoperator==确实比较std::set的内容和作品,但这里有一个引用C++11 N3337 standard draft,我相信这意味着。
该报价与std::vector的报价完全相同,我已在以下网址详细解释了该报价:C++:比较两个向量
为了避免与其他答复重复,现作简短总结:

  • 23.2.1“一般集装箱要求”规定所有集装箱使用equal()代替operator==
  • 25.2.11“Equal”定义了equal,并显式地显示了它在两个容器上迭代,比较每个容器的元素
2eafrhcq

2eafrhcq5#

在C++11或更高版本中,您可以使用==来比较两个集合是否相等。

std::set<int> contOne{ 10,20,30,40,50 };
std::set<int> contTwo{ 50,40,30,20,10 };
std::cout << (contOne == contTwo) ? 1 : 0; // 1

此外,您还可以使用==来比较2无序集

std::unordered_set<int> contOne{ 10,20,30,40,50 };
std::unordered_set<int> contTwo{ 50,40,30,20,10 };
std::cout << (contOne == contTwo) ? 1 : 0; // 1

只要键相同,大小也相同,容器就会相等**,无论键的顺序如何。**

相关问题