comment comparer deux std::set?
- Je faire 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++;
}
}
de 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 la bonne façon de le faire? Ou est de toute autre (spécial) de la comparaison de deux ensembles?
- Si
std::set
implémenteoperator==
je m'attends à être correct. - Il n'en œuvre, et il fait la bonne chose. Mais est-ce la question? Ou êtes-vous demandé si la
for
boucle est correcte? - Si vous êtes à la recherche d'un moyen de déterminer les éléments
s1
ets2
n'ont pas en commun, vous pouvez regarder lastd::set_symmetric_difference
à partir de la<algorithm>
en-tête. - Je ne suis pas sûr si
std::set
implémente==
(cplusplus.com/reference/set/set). Si vous avez un objet (qui n'a pas==
surchargé) au lieu deint
, je ne sais pas si vous aurez le même résultat - J'utilise l'opérateur == s1==s2, je me demande si c'est correct si oui, merci de la réponse, je l'accepte, sinon comment faut-il le faire?
- Sinon, effectuer une itération sur les ensembles (similaire à ce que vous avez), et de comparer chaque élément. Je pense qu'il est plus sûr de cette façon.
- De tous les intervenants qui ont répondu correctement, vous obtenez le meilleur parti d'une réputation de bosse. 🙂 Pensez à publier que comme une réponse.
- Belle façon de regarder... de toute façon, trop tard...
- non , jamais à la fin!
Vous devez vous connecter pour publier un commentaire.
Oui,
operator==
est correctement définie pour tous les conteneurs standard (sauf la non-ordonnée des conteneurs - basé sur 23.2.5.2 de la norme), et généralement faire une comparaison lexicographique. Voir, par exemple,ici. La citation:Depuis
std::set
est commandé conteneur, tout ensemble avec la même taille et les mêmes éléments (étant donné les éléments de comparaison sont les mêmes) aura nécessairement dans la même position, donc comparer l'égalité.==
œuvres (etstd::equal
fonctionne, aussi, de la même manière).set
est ordonné (le deuxième argument de modèle, c'est un opérateur de comparaison), d'où deux ensembles ayant la même comparaison et les mêmes éléments pas ont en différentes positions.operator==
(voir ici ou mieux, ici)Il y a plusieurs opérations définies dans la norme C++ de la bibliothèque de l'en-tête
<algorithm>
.std::set_difference
donne les éléments qui sont en jeu 1 mais pas 2.std::set_intersection
donne les éléments qui sont 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 la série 1 ou série 2.Les algorithmes ci-dessus peut également être appliquée à des conteneurs STL autres que
std::set
, mais les conteneurs doivent être triés d'abord (std::set
est triée par défaut).Une autre façon serait celui-ci:
Inspiré de l'élégant réponse ici.