Cómo utilizar el mapa desordenado de C ++

How Use C Unordered Map



Un mapa, también conocido como matriz asociativa, es una lista de elementos, donde cada elemento es un par clave / valor. Entonces, cada clave corresponde a un valor. Diferentes claves pueden tener el mismo valor, para trabajos normales. Por ejemplo, las claves pueden ser una lista de frutas y los valores correspondientes, los colores de las frutas. En C ++, el mapa se implementa como una estructura de datos con operadores y funciones miembro. Un mapa ordenado es aquel en el que los pares de elementos se han ordenado por claves. Un mapa desordenado es aquel en el que no hay ningún orden. Este artículo explica cómo usar el mapa desordenado de C ++, escrito como unordered_map. Necesita conocimientos en punteros de C ++ para comprender este artículo. unordered_map es parte de la biblioteca estándar de C ++.

Clase y objetos

Una clase es un conjunto de variables y funciones que trabajan juntas, donde las variables no tienen valores asignados. Cuando se asignan valores a las variables, la clase se convierte en un objeto. Diferentes valores dados a la misma clase dan como resultado diferentes objetos; es decir, diferentes objetos son de la misma clase con diferentes valores. Se dice que crear un objeto a partir de una clase es instanciar el objeto.







El nombre, unordered_map, es una clase. Un objeto creado a partir de la clase unordered_map tiene un nombre elegido por el programador.



Se necesita una función que pertenezca a una clase para crear una instancia de un objeto de la clase. En C ++, esa función tiene el mismo nombre que el nombre de la clase. Los objetos creados (instanciados) a partir de la clase tienen diferentes nombres que les da el programador.



Crear un objeto de la clase significa construir el objeto; también significa instanciar.





Un programa de C ++ que usa la clase unordered_map, comienza con las siguientes líneas en la parte superior del archivo:

#incluir
#incluir
usando el espacio de nombres std;

La primera línea es para entrada / salida. La segunda línea es para permitir que el programa use todas las características de la clase unordered_map. La tercera línea permite que el programa use los nombres en el espacio de nombres estándar.



Sobrecargar una función

Cuando dos o más firmas de funciones diferentes tienen el mismo nombre, se dice que ese nombre está sobrecargado. Cuando se llama a una función, el número y tipo de argumentos determinan qué función se ejecuta realmente.

Construcción / Copia Construcción

Construcción simple

Se puede construir un mapa desordenado y asignar valores de la siguiente manera:

unordered_map<constante carbonizarse*, constante carbonizarse*>umap;

umap['Plátano'] = 'amarillo';
umap['uva'] = 'verde';
umap['higo'] = 'púrpura';

La declaración comienza con la especialización de la plantilla con los tipos para los pares de clave y valor. A esto le sigue el nombre elegido por el programador para el mapa; luego un punto y coma. El segundo segmento de código muestra cómo asignar valores a sus claves.
Construcción por Initializer_list
Esto puede hacerse de la siguiente manera:

unordered_map<constante carbonizarse*, constante carbonizarse*>umap({{'Plátano', 'amarillo'},
{'uva', 'verde'}, {'higo', 'púrpura'}});

Construcción asignando Initializer_list
Ejemplo:

unordered_map<constante carbonizarse*, constante carbonizarse*>umap= {{'Plátano', 'amarillo'},
{'uva', 'verde'}, {'higo', 'púrpura'}};

Construcción copiando otro unordered_map
Ejemplo:

unordered_map<constante carbonizarse*, constante carbonizarse*>umap1({{'Plátano', 'amarillo'},
{'uva', 'verde'}, {'higo', 'púrpura'}});
unordered_map<constante carbonizarse*, constante carbonizarse*>umap2(umap1);

El elemento par

El siguiente código muestra cómo crear y acceder al elemento de par:

par<carbonizarse, constante carbonizarse*>pr= {'D', 'sea'};
costo<<pr.primero << ' orte';
costo<<pr.segundo << ' orte';

La salida es:

D
sea

la primera y la segunda son palabras reservadas para los dos elementos del par. Los valores en el par aún se pueden cambiar usando primero y segundo.

Un par se llama value_type en el tema del mapa desordenado.

Acceso al elemento unordered_map

mapped_type & operator [] (key_type && k)
Devuelve el valor de la clave correspondiente. Ejemplo:

unordered_map<constante carbonizarse*, constante carbonizarse*>umap;

umap['Plátano'] = 'amarillo';
umap['uva'] = 'verde';
umap['higo'] = 'púrpura';

constante carbonizarse *Derecha=umap['uva'];

costo<<Derecha<<' orte';

La salida es: verde. Los valores se pueden asignar de la misma manera; consulte más arriba.

unordered_map Capacidad

size_type size () const noexcepto
Devuelve el número de pares en el mapa.

unordered_map<constante carbonizarse*, constante carbonizarse*>umap;

umap['Plátano'] = 'amarillo';
umap['uva'] = 'verde';
umap['higo'] = 'púrpura';

costo<<umap.Talla() <<' orte';

La salida es 3.

bool vacío () const no excepto

Devuelve 1 para verdadero si el mapa no tiene pares y 0 para falso si tiene pares. Ejemplo:

unordered_map<constante carbonizarse*, constante carbonizarse*>umap;
costo<<umap.vacío() <<' orte';

La salida es 1.

Iteradores que regresan y la clase de mapa desordenado

Un iterador es como un puntero pero tiene más funcionalidad que el puntero.

comenzar () no excepto

Devuelve un iterador que apunta al primer par del objeto de mapa, como en el siguiente segmento de código:

unordered_map<constante carbonizarse*, constante carbonizarse*>umap;

umap['Plátano'] = 'amarillo';umap['uva'] = 'verde';umap['higo'] = 'púrpura';

unordered_map<constante carbonizarse*, constante carbonizarse*>::iteradoriter=umap.empezar();
par<constante carbonizarse*, constante carbonizarse*>pr= *iter;
costo<<pr.primero << ', ' <<pr.segundo << ' orte';

La salida es: fig, violeta. El mapa no está ordenado.

begin () const noexcept;

Devuelve un iterador que apunta al primer elemento de la colección de objetos del mapa. Cuando la construcción del objeto está precedida por const, se ejecuta la expresión begin () const en lugar de begin (). Bajo esta condición, los elementos del objeto no se pueden modificar. Se utiliza en el siguiente código, por ejemplo.

constanteunordered_map<constante carbonizarse*, constante carbonizarse*>umap({{'Plátano', 'amarillo'},
{'uva', 'verde'}, {'higo', 'púrpura'}});

unordered_map<constante carbonizarse*, constante carbonizarse*>::const_iteratoriter=umap.empezar();
par<constante carbonizarse*, constante carbonizarse*>pr= *iter;
costo<<pr.primero << ', ' <<pr.segundo << ' orte';

La salida es: fig, violeta. El mapa no está ordenado. Tenga en cuenta que esta vez se ha utilizado const_iterator, en lugar de solo iterador, para recibir el iterador devuelto.

fin () no excepto

Devuelve un iterador que apunta inmediatamente más allá del último elemento del objeto de mapa.

end () const no excepto

Devuelve un iterador que apunta inmediatamente más allá del último elemento del objeto de mapa. Cuando la construcción del objeto de mapa está precedida por const, se ejecuta la expresión end () const en lugar de end ().

Operaciones unordered_map

búsqueda de iterador (const key_type & k)

Busca un par de la clave dada en el mapa. Si se encuentra, devuelve el iterador. Si no se encuentra, devuelve un iterador que apunta al final del mapa, que no es un par. El siguiente código muestra cómo utilizar esta función miembro:

unordered_map<carbonizarse,carbonizarse>umap;

umap['a'] = 'b';umap['c'] = 'D';umap['Y'] = 'F';

unordered_map<carbonizarse,carbonizarse>::iteradoriter=umap.encontrar('c');
si (umap.encontrar('c') !=umap.fin())
{
par<carbonizarse,carbonizarse>pr= *iter;
costo<<pr.primero << ', ' <<pr.segundo << ' orte';
}

La salida es: c, d

const_iterator find (const key_type & k) const;

Esta versión de la función se llama, si la creación del mapa desordenado comienza con const, haciendo que todos los elementos del mapa sean de solo lectura.

Modificadores unordered_map

inserción de par (value_type && obj)
Un mapa desordenado significa que los pares no están en ningún orden. Por lo tanto, el programa inserta el par en cualquier lugar que considere conveniente. La función devuelve, par. Si la inserción fue exitosa, bool será 1 para verdadero, de lo contrario será 0 para falso. Si la inserción se realiza correctamente, el iterador apuntará al elemento recién insertado. El siguiente código ilustra el uso:

unordered_map<constante carbonizarse*, constante carbonizarse*>umap;

umap['Plátano'] = 'amarillo';
umap['uva'] = 'verde';
umap['higo'] = 'púrpura';

umap.insertar({{'cereza', 'red'}, {'fresa', 'red'}});

costo<<umap.Talla() << ' orte';

La salida es: 5. Se puede insertar más de un par.

tamaño_tipo borrar (const key_type & k)

Esta función borra un par de unordered_map. El siguiente segmento de código ilustra:

unordered_map<constante carbonizarse*, constante carbonizarse*>umap;

umap['Plátano'] = 'amarillo';
umap['uva'] = 'verde';
umap['higo'] = 'púrpura';

En ten uno=umap.borrar('uva');

costo<<umap.Talla() << ' orte';

La salida es 2.
intercambio vacío (unordered_map &)
Se pueden intercambiar dos mapas desordenados, como se ilustra en este segmento de código:

unordered_map<constante carbonizarse*, constante carbonizarse*>umap1= {{'Plátano', 'amarillo'},
{'uva', 'verde'}, {'higo', 'púrpura'}, {'fresa', 'red'}};

unordered_map<constante carbonizarse*, constante carbonizarse*>umap2= {{'cereza', 'red'}, {'Lima', 'verde'}};

umap1.intercambio(umap2);

unordered_map<constante carbonizarse*, constante carbonizarse*>::iteradoriter1=umap1.empezar();
par<constante carbonizarse*, constante carbonizarse*>pr1= *iter1;
unordered_map<constante carbonizarse*, constante carbonizarse*>::iteradoriter2=umap2.empezar();
par<constante carbonizarse*, constante carbonizarse*>pr2= *iter2;

costo<< 'Primera clave y tamaño de umap1:'<<pr1.primero <<', '<<umap1.Talla() << ' orte';
costo<< 'Primera clave y tamaño de umap2'<<pr2.primero <<', '<<umap2.Talla() << ' orte';
unordered_map<constante carbonizarse*, constante carbonizarse*>umap1= {{'Plátano', 'amarillo'},
{'uva', 'verde'}, {'higo', 'púrpura'}, {'fresa', 'red'}};
unordered_map<constante carbonizarse*, constante carbonizarse*>umap2= {{'cereza', 'red'}, {'Lima', 'verde'}};

umap1.intercambio(umap2);

unordered_map<constante carbonizarse*, constante carbonizarse*>::iteradoriter1=umap1.empezar();
par<constante carbonizarse*, constante carbonizarse*>pr1= *iter1;
unordered_map<constante carbonizarse*, constante carbonizarse*>::iteradoriter2=umap2.empezar();
par<constante carbonizarse*, constante carbonizarse*>pr2= *iter2;

costo<< 'Primera clave y tamaño de umap1:'<<pr1.primero <<', '<<umap1.Talla() << ' orte';
costo<< 'Primera clave y tamaño de umap2'<<pr2.primero <<', '<<umap2.Talla() << ' orte';

La salida es:

Primera clave y tamaño de umap1: lime, 2

Primera clave y tamaño de umap2 fresa, 4

El mapa no está ordenado. Tenga en cuenta que la longitud de un mapa aumenta si es necesario. Los tipos de datos deben ser los mismos.

Clase y sus objetos instanciados

Un valor es para un tipo de datos, como un objeto instanciado es para una clase. La construcción del mapa desordenado también puede aceptar una clase como tipo de datos. El siguiente programa ilustra esto:

#incluir
#incluir
usando el espacio de nombres std;

clase TheCla
{
público:
En ten uno;
estático carbonizarsech;

vacíofunción(carbonizarseno, constante carbonizarse *pag)
{
costo<< 'Existen ' <<en uno<< 'libros que valen' <<no<<pag<< ' en la tienda.' << ' orte';
}
estático vacíodivertida(carbonizarsech)
{
si (ch== 'a')
costo<< 'Función oficial de miembro estático' << ' orte';
}
};

En tprincipal()
{
TheCla obj1;TheCla obj2;TheCla obj3;TheCla obj4;TheCla obj5;

unordered_map<constante carbonizarse*,TheCla>umap;
umap= {{'Plátano',obj1}, {'uva',obj2}, {'higo',obj3}, {'fresa',obj4}, {'Lima',obj5}};

costo<<umap.Talla() << ' orte';

regreso 0;
}

La salida es: 5.

La definición de clase tiene dos miembros públicos de datos y dos funciones de miembros públicos. En la función main (), se crean instancias de diferentes objetos para la clase. A continuación, se crea una instancia de un mapa desordenado, donde cada par consta del nombre de una fruta y un objeto de la clase. Se muestra el tamaño del mapa. El programa se compila sin ningún mensaje de advertencia o error.

Aplicación del mapa

La matriz asocia un índice al valor. Los pares clave / valor existen en muchas situaciones de la vida, que se pueden programar. El par clave / valor de fruta / color es solo un ejemplo. Otro ejemplo es el nombre de las personas y sus edades. En este caso, el par será de un tipo, par. También se puede emparejar. En este último caso, se utilizará la directiva de preprocesamiento. Un par clave / valor puede seguir siendo el nombre de las parejas casadas. En los países donde existe la poligamia, habrá diferentes esposas para un hombre.

Formación de un mapa

Un mapa no es una matriz bidimensional, con dos columnas. Un mapa funciona con una función hash. La clave está codificada por la función hash, en un número entero de una matriz. Es esta matriz la que contiene los valores. Entonces, en realidad hay una matriz con los valores, y las claves se asignan a los índices de la matriz, por lo que se realizan las correspondencias entre las claves y los valores. El hash es un tema extenso y no se trata en este artículo.

Conclusión

Un mapa, también conocido como matriz asociativa, es una lista de elementos, donde cada elemento es un par clave / valor. Entonces, cada clave corresponde a un valor. En C ++, el mapa se implementa como una estructura de datos con operadores y funciones miembro. Un mapa ordenado es aquel en el que los pares de elementos se han ordenado por claves. Un mapa desordenado es aquel en el que no hay ningún orden.

Técnicamente, un hash consta de elementos de pareja. De hecho, el par es una estructura de datos completa con sus funciones miembro y operadores. Los dos parámetros de plantilla para el par son los mismos dos parámetros de plantilla para unordered_map.

Initializer_list para el mapa es una matriz literal de literales. Cada literal interno consta de dos objetos, el par clave / valor.

Las funciones miembro y los operadores para unordered_map se pueden clasificar bajo los siguientes encabezados: unordered_map construcción / copia de construcción, unordered_map Capacity, unordered_map iterador, unordered_map Operations y unordered_map Modifiers.

Se utiliza un mapa desordenado cuando una clave debe asignarse a un valor.

Chrys