sábado, 26 de abril de 2014

C++ - Contenedores: Map

C++ / C++11
Map


Hola. Ya hace tiempo desde la última entrada, así que aquí va esta, para continuar la serie.
En la última entrada, hemos visto por encima el uso básico del vector, en este caso, veremos el map.



Map

Este contenedor, está incluído en la librería <map>. Su uso es casi ta sencillo como el vector:
El map guarda 2 datos: En primer lugar, guarda las llaves o keys. Las keys no se pueden repetir. Cada key tiene asignado un valor. Los valores sí se pueden repetir.
Cuando buscamos un dato en un map, lo que vamos a buscar es el valor que tiene asignado una determinada key. Además, tanto la key como el valor pueden ser de cualquier tipo, salvo por 1 regla: la key, si es una clase, ha de tener la siguiente función declarada: "bool operator<(const asd a)const{/* */}".
¿Por qué ha de tener este operador, el operador menor que?
El map tiene otra utilidad muy importante: ordena sus elementos según la key. Los ordena utilizando el operator<().

Para ver bien todos estos conceptos, veamos un ejemplo sencillo:


#include <map>
#include <iostream>

using namespace std;
 /** Hagamos una especie de diccionario **/
int main(){
    map<string,string> m; //key:string, value:string
    m["enorme"] = "Que es muy grande";
    m["enano"] = "Que es muy pequeño";

    cout << "Definicion de 'enorme': " << m["enorme"];

}

Como habéis visto, el operator[] nos permite acceder a su llave, o crearla si no ha sido creada aún. También podemos acceder a sus elementos ordenados haciendo uso de su iterator.

    for(auto it:m)
        cout << it.first << " significa " << it.second << endl;


Nota: El iterator de map retorna los valores como pair. Un pair guarda 2 valores, que corresponden al first (key) y al second (value).

Otra implementación importante de C++11, es el for( : ) y el auto.
El auto asigna el tipo adecuado a una variable. Por ejemplo, si ponemos "auto a = 27;" estamos declarando 'a' como un entero (int).
El for( type a : b ) nos reduce lo que tenemos que escribir. Es como poner "for(auto a=b.begin(); a!=b.end(); a++){}".

Si probamos ese ejemplo, veremos que sale la salida ordenada. El map ordena su key, ya que guarda los datos como un árbol binario, hecho que le da mucha más velocidad al buscar keys.

Así que ya sabéis, si queréis que un map os ordene los elementos, o queréis guardar muchos pares de datos, solo usad map. Si queréis guardar como key una clase vuestra, no olvidéis ponerle el operator, aunque es posible que el compilador ya os diga qué operator falta.

Ahora solo, suerte!

No hay comentarios:

Publicar un comentario