cómo comparar dos std::set?


Hago tal comparación de dos 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++;
    }
}

Salida:

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

Pregunta:

Es esta la manera correcta de hacerlo? ¿O hay alguna otra forma (especial) de comparar dos conjuntos?

 25
Author: Tempux, 2013-04-24

3 answers

Sí, operator== se define correctamente para todos los contenedores estándar ( excepto los contenedores no ordenados - basado en 23.2.5.2 del estándar), y generalmente hará una comparación lexicográfica. Ver por ejemplo aquí. La cita pertinente:

Comprueba si los contenidos de lhs y rhs son iguales, es decir, si lhs.tamaño () = = rhs.size () y cada elemento en lhs tiene un elemento equivalente en rhs en la misma posición.

Dado que std::set es un contenedor ordenado, cualquier si se establece con el mismo tamaño y los mismos elementos (dado que los comparadores son los mismos) necesariamente los tendrá en la misma posición, por lo tanto, se comparará igual.

 35
Author: Yuushi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-24 04:20:22

Hay varias operaciones de conjunto en el encabezado de biblioteca estándar de C++ <algorithm>.

std::set_difference da aquellos elementos que están en el conjunto 1 pero no en el conjunto 2.

std::set_intersection da los elementos que están en ambos conjuntos.

std::set_symmetric_difference da aquellos elementos que aparecen en uno de los conjuntos pero no en ambos.

std::set_union da los elementos que están en conjunto 1 o conjunto 2.

Los algoritmos anteriores también se pueden aplicar a contenedores STL que no sean std::set, pero los contenedores tienen que ser ordenados primero (std::set está ordenado por defecto).

 17
Author: WiSaGaN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-25 14:14:20

Otra manera sería esta:

template<typename Set>

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

, Inspirado en la elegante respuesta aquí.

 1
Author: Rishiraj Surti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:17:43