Anuncios

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

Anuncios

En este post mencionamos que este es un contenedor de tipo asociativa. Estas en lugar de almacenar los elementos en base a una posicion en el mismo, se les asigna una clave o identificacion para poder manipular la informacion. Veamos como es la sintaxis de la declaracion de este:

map< tipo_clave, tipo_valor > nombre_identificador;
Anuncios

Entre el signo mayor y menor primero pasaremos el tipo de dato que actuara como clave del valor. Se separa con una coma y el tipo que sera para la informacion. Finalmente pasamos el nombre que usaremos para identificarlo. Para entender el concepto, analicemos el siguiente ejemplo:

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

class Coche
{
public:
        Coche(): suMarca("Generica"), suModelo("Generico"),suAnio(1976) {}
        Coche(std::string marca, std::string modelo, int anio):
                suMarca(marca), suModelo(modelo), suAnio(anio)
                {}
        std::string GetMarca() const { return suMarca; }
        std::string GetModelo() const { return suModelo; }
        int GetAnio() const { return suAnio; }
private:
        std::string suMarca;
        std::string suModelo;
        int suAnio;
};

std::ostream & operator<< (std::ostream & salida, const Coche & rhs)
{
        salida << "tiene un " << rhs.GetMarca() << " " << rhs.GetModelo();
        salida << " del año " << rhs.GetAnio();
        return salida;
}

typedef std::map< std::string, Coche > Cochera;

template < class T, class A >
void mostrar_mapa(const std::map< T, A > & m)
{
        for(typename std::map< T, A >::const_iterator ci=m.begin();
                                ci != m.end(); ++ci)
                std::cout << ci->first << " " << ci->second << std::endl;
}

int main()
{
        Coche coche1("VW","GOL",1994);
        Coche coche2("FORD","ECOSPORT",2010);
        Coche coche3("AUDI","Q3",2024);
        Cochera cocheraNueva;
        cocheraNueva["Tincho"] = coche1;
        cocheraNueva["Enzo"] = coche3;
        cocheraNueva["Marta"] = coche2;
        mostrar_mapa(cocheraNueva);

        return 0;
}
Anuncios
Anuncios

Primero importaremos los tres modulos para utilizar en el codigo. El primero es el basico para utilizar nuestros codigos, el segundo para poder crear objetos de tipo string y el ultimo es para implementar a map. Lo siguiente es una clase llamada Coche siendo muy similar a lo que vimos en los posts anteriores pero haremos un par de modificaciones a la misma. En la parte privada tendremos tres propiedades para almacenar la marca, modelo y año del coche. En la parte publica tendremos dos constructores para iniciar los valores de la parte privada. El predeterminado los inicia de manera generica y el segundo recibe todos los datos para iniciarlos. Lo siguiente son tres metodos para devolver los valores de cada una de las propiedades privadas. Luego tenemos una sobrecarga del operador << para esta clase. Donde manipularemos al objeto de tipo Coche mediante rhs y al objeto que pasamos como salida le mandaremos un mensaje donde tendra todos los resultados de los metodos de Coche y finalmente devolveremos el objeto que usaremos para salida. Para luego crear un alias para el tipo map con los tipos string y Coche al cual denominaremos Cochera, el cual usaremos a continuacion.

Anuncios
Anuncios

Antes de pasar al main tenemos una funcion para mostrar el contenido de los map que generemos. Para ello primero crearemos una plantilla que recibira dos tipos de datos. Luego como argumento el map recibira los tipos de la plantilla para la clave y el valor. En el bloque tenemos un for para mostrar todos los valores almacenados en el map. Primera curiosidad, pasamos un typename antes del map. Este lo usamos para el parametro del tipo y este puede ubicarlo correctamente porque es dependiente del rango o scope. Para crear nuestro objeto iterador usamos a const_iterator, el cual desreferencia al nodo donde se encuentra ubicado permitiendo su uso, y el objeto tendra como valor inicial al primer elemento dentro del map. La condicion se cumplira mientras este objeto sea distinto del ultimo elemento. Para finalmente ir cambiando la posicion mediante cada pasada. En el bloque mostraremos los datos contenidos. Primero mostraremos a la clave mediante la palabra first, siempre muestra el nombre de la clave, y los datos mediante second. Pero como sobrecargamos al operador << para esta clase, lo que mostrara es el mensaje generado con todos los datos.

Anuncios

En el main crearemos tres objetos del tipo Coche con distintos datos. Lo siguiente es crear un map con el alias Cochera y a este nuevo objeto le asignaremos tres nombres que actuaran como claves y a cada clave uno de los objetos creados anteriormente. Para finalmente mostrar todos los datos del map mediante mostrar_mapa. Compilemos y veamos como es la salida:

$ ./stl
Enzo tiene un AUDI Q3 del año 2024
Marta tiene un FORD ECOSPORT del año 2010
Tincho tiene un VW GOL del año 1994
$
Anuncios

Primera diferencia con las secuenciales: a la hora de recuperarlas, sin necesidad de hacer nada extra, nos la devolvio ordenada alfabeticamente. A pesar de que no las ingresamos de esa manera. Si bien las secuenciales tampoco son fijas y son dinamicas, aqui no necesitamos de una funcion para poder agregar la informacion al inicio o final de la coleccion. Sino con simplemente crear una nueva clave, y que no coincida con alguna anterior, se nos agregara un nuevo valor. Tal como hicimos para agregar los tres datos en el codigo. Veamos algunas funciones que tenemos disponibles:

  • max_size(), encargada de mostrar el tamaño maximo disponible para el map
  • size(), encargada de mostrar el tamaño actual del map
  • empty(), esta se encarga de definir si el map 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 map
  • end(), devuelve un iterador que apunta a la ultima posicion del map
  • pair_insert(clave, valor), agrega un nuevo elemento en el map
  • erase(posicion iter), remueve un elemento en base a la posicion de iteracion
  • erase(clave), remueve un elemento en base a la clave informada
  • clear(), remueve todos los elementos de un map
Anuncios

En resumen, hoy hemos visto map, que es, para que sirve, como se utiliza, y un ejemplo practico para ver como trabaja asi como algunas funciones que disponemos. 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