it-swarm.com.de

Wie vergleiche ich zwei std :: set?

Ich mache einen solchen Vergleich von zwei 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++;
    }
}

ausgabe:

sets: true
s1: 10  s2: 10
s1: 20  s2: 20
s1: 30  s2: 30
s1: 40  s2: 40
s1: 50  s2: 50

Frage:

Ist das der richtige Weg? Oder gibt es eine andere (spezielle) Möglichkeit, zwei Sätze zu vergleichen?

30
user2313793

Ja, operator== ist für alle Standardcontainer ( mit Ausnahme der ungeordneten Container (basierend auf 23.2.5.2 des Standards) korrekt definiert und führt im Allgemeinen einen lexikografischen Vergleich durch . Siehe zum Beispiel hier . Das relevante Zitat:

Überprüft, ob der Inhalt von lhs und rhs gleich ist, d. H. Ob lhs.size () == rhs.size () und jedes Element in lhs an derselben Position ein äquivalentes Element in rhs hat.

Schon seit std::set ist ein bestellter Container. Jede Menge mit derselben Größe und denselben Elementen (vorausgesetzt, die Komparatoren sind gleich) hat sie notwendigerweise an derselben Position und wird daher gleich verglichen.

40
Yuushi

Der C++ - Standardbibliotheksheader <algorithm> Enthält mehrere festgelegte Operationen.

std::set_difference gibt die Elemente an, die in Satz 1, aber nicht in Satz 2 enthalten sind.

std::set_intersection gibt die Elemente an, die in beiden Mengen enthalten sind.

std::set_symmetric_difference gibt die Elemente an, die in einer der Mengen vorkommen, aber nicht in beiden.

std::set_union gibt die Elemente an, die entweder in Satz 1 oder in Satz 2 enthalten sind.

Die obigen Algorithmen können auch auf andere STL-Container als std::set Angewendet werden, aber die Container müssen zuerst sortiert werden (std::set Ist standardmäßig sortiert).

20
WiSaGaN

Ein anderer Weg wäre dieser:

template<typename Set>

bool set_compare(Set const &lhs, Set const &rhs){
    return lhs.size() == rhs.size() 
        && equal(lhs.begin(), lhs.end(), rhs.begin());
}

Inspiriert von der eleganten Antwort hier .

1
Rishiraj Surti