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つのセットを比較する他の(特別な)方法はありますか?
はい、 operator==
は、すべての標準コンテナ(except順不同コンテナ-標準の23.2.5.2に基づく)に対して正しく定義されており、通常、辞書式比較を行います。たとえば here を参照してください。関連する引用:
Lhsとrhsの内容が等しいかどうか、つまりlhs.size()== rhs.size()とlhsの各要素がrhsの同じ位置に同等の要素を持っているかどうかをチェックします。
std::set
は順序付けされたコンテナであり、同じサイズと同じ要素(コンパレータが同じ場合)のセットは必ず同じ位置に配置されるため、比較は等しくなります。
C++標準ライブラリヘッダー<algorithm>
にはいくつかの集合演算があります。
std::set_difference
は、セット1にあるがセット2にはない要素を提供します。
std::set_intersection
は、両方のセットにある要素を提供します。
std::set_symmetric_difference
は、両方ではなく一方のセットに表示される要素を提供します。
std::set_union
は、セット1またはセット2の要素を提供します。
上記のアルゴリズムは、std::set
以外のSTLコンテナにも適用できますが、コンテナは最初にソートする必要があります(std::set
はデフォルトでソートされます)。
別の方法はこれです:
template<typename Set>
bool set_compare(Set const &lhs, Set const &rhs){
return lhs.size() == rhs.size()
&& equal(lhs.begin(), lhs.end(), rhs.begin());
}
エレガントな答えからインスピレーションを受けた こちら 。