Anuncios

Bienvenidos sean a este post, hoy veremos un contenedor de stl.

Anuncios

Como mencionamos en este post este es un contenedor asociativo. Si bien no trabaja como map mediantte una relacion entre clave y valor sino mas bien por posicion. Pero no podemos recuperar la informacion de esta manera porque sin importar como agregamos la informacion. Esta se ordenara internamente de manera automatica. Para entender el concepto vamos a analizar el siguiente ejemplo:

#include <iostream>
#include <string.h>
#include <set>

template < class T, class A >
void mostrar_set(const std::set< T, A > & s)
{
        for(T i : s)
                std::cout << i << std::endl;
}

int main()
{
        std::set< std::string > coches = {"VW","FORD","AUDI","TOYOTA","MAZDA"};
        mostrar_set(coches);

        return 0;
}
Anuncios
Anuncios

Primero importaremos las librerias que usaremos, entre ellas la de set. Lo siguiente es una funcion donde implementaremos una plantilla para permitir la recepcion de set genericos como argumento de esta. En este caso recibiremos dos. El primero sera para el tipo que almacenara cada set y el segundo sera para cuando necesitemos un complemento pero de eso hablaremos en un momento. En el bloque usaremos un for mejorado para mostrar todos elementos contenidos en este. Para el tipo del set usamos a la plantilla y le pasamos el recibido como argumento. En el main, primero definiremos un set del tipo string llamado coches y en este almacenaremos varias marcas de coches. Para finalmente hacer un llamado a mostrar_set y pasar el set anterior. Compilemos y veamos como es la salida:

$ ./stl
AUDI
FORD
MAZDA
TOYOTA
VW
$
Anuncios

Como mencionamos al principio, este tipo de contenedor no es secuencial porque a medida que recibe la informacion la ordena de menor a mayor automaticamente por lo tanto no podemos recuperarla mediante una posicion como pasa con las secuenciales. Pero esto no queda aca tambien podemos asignarle otra forma de orden. Volvamos al codigo anterior y modifiquemos el main de la siguiente manera:

int main()
{
        std::set< std::string, std::greater<std::string> > coches = {"VW",
                                "FORD","AUDI","TOYOTA","MAZDA"};
        mostrar_set(coches);

        return 0;
}
Anuncios

En este caso solamente hicimos una pequeña modificacion en el set. Despues de establecido el tipo le agregamos un modificador. greater le dice al set que debe ordenar de mayor a menor. Aqui entra en accion la segunda clase de la plantilla para poder manipularla. El resto sigue siendo el mismo codigo. Compilemos y veamos como es la salida:

$ ./stl
VW
TOYOTA
MAZDA
FORD
AUDI
$
Anuncios

Con ese solo cambio nos ordeno todos los elementos de mayor a menor. Tomemos nuevamente el codigo y modifiquemos el main de la siguiente manera:

int main()
{
        std::set< std::string, std::less< std::string > > coches = {"VW",
                                "FORD","AUDI","TOYOTA","MAZDA"};
        coches.insert("CHEVROLET");
        coches.insert("VOLVO");
        coches.insert("FIAT");
        mostrar_set(coches);

        return 0;
}
Anuncios

La primera modificacion es que en lugar de usar a greater le pasamos un less para que lo ordene de menor a mayor. Y luego mediante insert procedemos a agregar tres nuevas marcas. El resto sigue siendo igual. Compilemos y veamos como es la salida ahora:

$ ./stl
AUDI
CHEVROLET
FIAT
FORD
MAZDA
TOYOTA
VOLVO
VW
$
Anuncios

No solo volvimos al orden original sino que a su vez ordeno automaticamente los nuevos valores ingresados. Por esta razon, no se lo considera secuencial sino asociativo y por ende no podemos buscarlo por posicion. Volvamos a modificar el codigo de main de la siguiente manera:

int main()
{
        std::set< std::string, std::less< std::string > > coches = {"VW",
                                "FORD","AUDI","TOYOTA","MAZDA"};
        coches.insert("CHEVROLET");
        coches.insert("VOLVO");
        coches.insert("FIAT");
        coches.erase("AUDI");
        coches.erase("MAZDA");
        mostrar_set(coches);

        return 0;
}
Anuncios

Al codigo anterior le agregamos dos lineas nuevas con la funcion erase y le pasamos dos valores para que sean eliminados del set. Compilemos y veamos como es la salida:

$ ./stl
CHEVROLET
FIAT
FORD
TOYOTA
VOLVO
VW
$
Anuncios

Como pueden ver se eliminaron los valores informados y nuevamente se ordenaron automaticamente sin necesidad de intervencion nuestra. Con esto ya vimos varias tareas que podemos aplicar a nuestros set. Veamos algunas funciones que podemos usar:

  • max_size(), encargada de mostrar el tamaño maximo disponible para el set
  • size(), encargada de mostrar el tamaño actual del set
  • empty(), esta se encarga de definir si el set tiene contenido o no por medio de chequeo simple ya que devuelve un booleano
  • begin(), devuelve un iterador que apunta a la primera posicion del set
  • end(), devuelve un iterador que apunta a la ultima posicion del set
  • insert(valor), agrega un nuevo elemento en el set
  • erase(valor), remueve un elemento en base a la clave informada
  • clear(), remueve todos los elementos de un set
Anuncios

En resumen, hoy hemos visto a set, que es, para que sirve, como se utiliza, una serie de ejemplos practicos para verlo en accion, y algunas funciones disponibles. Espero les haya resultado de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios
pp258

Donatión

It’s for site maintenance, thanks!

$1.50