web-dev-qa-db-fra.com

comment comparer deux std :: set?

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?

30
user2313793

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.

40
Yuushi

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).

20
WiSaGaN

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 .

1
Rishiraj Surti