2013-04-24 28 views
23

zrobić takiego porównania dwóch std::setjak porównać dwa 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++; 
    } 
} 

wyjściowa:

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

Pytanie:

Czy to dobry sposób, żeby to zrobić? Czy jest jakikolwiek inny (specjalny) sposób porównywania dwóch zestawów?

+3

Jeśli 'std :: set' implementuje' operator == 'Spodziewam się, że jest poprawny. –

+0

Wykonuje to i robi to, co trzeba. Ale czy to jest pytanie? Czy też pytasz, czy pętla 'for' jest poprawna? – jogojapan

+1

Jeśli szukasz sposobu na określenie elementów 's1' i' s2', _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ __ _ __ nie_ _ _ _ __ _ __ w/cpp/algorithm/set_symmetric_difference) z nagłówka ''. – jogojapan

Odpowiedz

30

Tak, operator== jest poprawnie zdefiniowane dla wszystkich standardowych pojemnikach (wyjątkiem nieuporządkowanego pojemniki - na podstawie 23.2.5.2 normy), a ogólnie zrobić leksykograficzny porównanie. Zobacz na przykład here. Odpowiedni podanie:

czeki, jeśli zawartość LHS i RHS są równe, to znaczy, czy lhs.size() == rhs.size(), a każdy element LHS jest równoważny element RHS w tym samym pozycja.

Ponieważ std::set jest uporządkowana opakowania, każdy zestaw o takiej samej wielkości i te same elementy (podane komparatorów są takie same) koniecznie mieć w tej samej pozycji, stąd porówna równe.

+0

, ale dwa zestawy z identycznymi elementami, ale w różnych pozycjach matematycznych są równe. Czy są one równe w std :: set ==? Myślę, że tak, ale iteracja i comapre doprowadziłyby nas do błędnych wyników. –

+7

@gumtree 'std :: set' nie zachowuje elementów w kolejności, w jakiej je wstawiłeś. Sortuje je. Tak więc, iteracja będzie działać tak samo jak '==' works (i 'std :: equal' działa również w ten sam sposób). – jogojapan

+0

@ gumtree To jest punkt - "set" jest uporządkowany (drugi argument szablonu jest operatorem porównania), stąd dwa zestawy mające ten sam komparator i te same elementy ** nie mogą ** mieć ich w różnych pozycjach. – Yuushi

15

Istnieje kilka operacji zestawu w nagłówku standardowej biblioteki C++ <algorithm>.

std::set_difference daje te elementy, które są w zestawie 1, ale nie określone 2.

std::set_intersection daje te elementy, które są w obu zestawach.

std::set_symmetric_difference podaje elementy, które pojawiają się w jednym z zestawów, ale nie oba.

std::set_union daje te elementy, które są albo w zestawie 1 iub zestaw 2.

Algorytmy powyżej, mogą być również stosowane do pojemników STL innych niż std::set, a pojemniki mają być najpierw sortowane (std::set sortowane domyślnie).

0

Innym sposobem byłoby to:

template<typename Set> 

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

Zainspirowany od eleganckiego odpowiedź here.