Je fais une telle comparaison de deux 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++;
}
}
sortie:
sets: true
s1: 10 s2: 10
s1: 20 s2: 20
s1: 30 s2: 30
s1: 40 s2: 40
s1: 50 s2: 50
Question:
Est-ce que c'est la bonne façon de le faire? Ou existe-t-il une autre manière (spéciale) de comparer deux ensembles?
Oui, operator==
est correctement défini pour tous les conteneurs standard ( sauf les conteneurs non ordonnés - basé sur 23.2.5.2 de la norme), et fera généralement une comparaison lexicographique . Voir par exemple ici . La citation pertinente:
Vérifie si le contenu de lhs et rhs est égal, c'est-à-dire si lhs.size () == rhs.size () et chaque élément de lhs a un élément équivalent dans rhs à la même position.
Puisque std::set
est un conteneur ordonné, tout ensemble ayant la même taille et les mêmes éléments (étant donné que les comparateurs sont les mêmes) les aura nécessairement dans la même position, donc les comparera égaux.
Il existe plusieurs opérations de définition dans l'en-tête de bibliothèque standard C++ <algorithm>
.
std::set_difference
donne les éléments qui sont dans l'ensemble 1 mais pas l'ensemble 2.
std::set_intersection
donne les éléments qui se trouvent dans les deux ensembles.
std::set_symmetric_difference
donne les éléments qui apparaissent dans l'un des ensembles mais pas les deux.
std::set_union
donne les éléments qui se trouvent dans l'ensemble 1 ou l'ensemble 2.
Les algorithmes ci-dessus peuvent également être appliqués à des conteneurs STL autres que std::set
, mais les conteneurs doivent d'abord être triés (std::set
est trié par défaut).
Une autre façon serait la suivante:
template<typename Set>
bool set_compare(Set const &lhs, Set const &rhs){
return lhs.size() == rhs.size()
&& equal(lhs.begin(), lhs.end(), rhs.begin());
}
Inspiré de la réponse élégante ici .