48

我做了两个这样的比较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

4 回答 4

62

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

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

由于std::set是有序容器,因此任何具有相同大小和相同元素的集合(假设比较器相同)都必须将它们放在相同的位置,因此将比较相等。

于 2013-04-24T04:06:56.913 回答
30

C++ 标准库 header 中有几个集合操作<algorithm>

std::set_difference给出那些在集合 1 但不在集合 2 中的元素.

std::set_intersection给出两个集合中的元素.

std::set_symmetric_difference给出出现在其中一组但不是同时出现的那些元素.

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

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

于 2013-09-25T14:14:20.087 回答
4

另一种方法是:

template<typename Set>

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

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

于 2016-11-22T04:31:39.687 回答
2

C++11==标准std::set

其他人提到确实operator==比较了std::set内容和作品,但这里引用了C++11 N3337 标准草案,我相信这暗示了这一点。

std::vector引用与我在以下位置详细解释的引用完全相同: C++:比较两个向量

作为一个简短的总结,以避免与其他答案重复:

  • 23.2.1 “一般容器要求”规定所有容器equal()用于operator==
  • 25.2.11 "Equal" 定义equal并明确表明它遍历两个容器,比较每个容器的元素
于 2019-11-06T12:23:37.877 回答