web-dev-qa-db-ja.com

2つのstd :: setを比較する方法は?

2つの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

質問:

これは正しい方法ですか?または、2つのセットを比較する他の(特別な)方法はありますか?

30
user2313793

はい、 operator==は、すべての標準コンテナ(except順不同コンテナ-標準の23.2.5.2に基づく)に対して正しく定義されており、通常、辞書式比較を行います。たとえば here を参照してください。関連する引用:

Lhsとrhsの内容が等しいかどうか、つまりlhs.size()== rhs.size()とlhsの各要素がrhsの同じ位置に同等の要素を持っているかどうかをチェックします。

std::setは順序付けされたコンテナであり、同じサイズと同じ要素(コンパレータが同じ場合)のセットは必ず同じ位置に配置されるため、比較は等しくなります。

40
Yuushi

C++標準ライブラリヘッダー<algorithm>にはいくつかの集合演算があります。

std::set_difference は、セット1にあるがセット2にはない要素を提供します。

std::set_intersection は、両方のセットにある要素を提供します。

std::set_symmetric_difference は、両方ではなく一方のセットに表示される要素を提供します。

std::set_union は、セット1またはセット2の要素を提供します。

上記のアルゴリズムは、std::set以外のSTLコンテナにも適用できますが、コンテナは最初にソートする必要があります(std::setはデフォルトでソートされます)。

20
WiSaGaN

別の方法はこれです:

template<typename Set>

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

エレガントな答えからインスピレーションを受けた こちら

1
Rishiraj Surti