48

私はそのような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 つのセットを比較する他の (特別な) 方法はありますか?

4

4 に答える 4

62

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

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 に答える