C ++ Map Emplace

C ++ Map Emplace
En C ++, las funciones emplace () e insert () hacen algo similar. Cuando al programador no le importan las ventajas que tiene Emplace, puede usar inserción (). Emplace construye el elemento de interés dentro del contenedor de interés al insertar copias del elemento desde algún lugar o mover el elemento al contenedor de interés.

Copiar noción

Considere las siguientes dos listas de caracteres:

lista la = 'a', 'b', 'c', 'd';
lista lb = 'e', 'f', 'g', 'h';

'G' en LB se puede copiar y colocar frente a 'D' en Los Ángeles, para tener,

lista la = 'a', 'b', 'c', 'g', 'd';
lista lb = 'e', 'f', 'g', 'h';

Mueve la noción

'G' en LB se puede quitar y colocar frente a 'D' en Los Ángeles, para tener,

lista la = 'a', 'b', 'c', 'g', 'd';
lista lb = 'e', 'f', 'h';

Valor en el elemento

Copiar y moverse no son tan contundentes como se muestra arriba. En una situación real, cada valor (e.gramo., carácter) está en un elemento. Entonces, si una lista de chars tiene cuatro caracteres, entonces la lista tiene cuatro elementos. Si una lista de chars tiene tres caracteres, entonces la lista tiene tres elementos.

Un elemento puede ser una estructura con 3 miembros de datos. El primer miembro de datos es un puntero que apunta al elemento anterior en la lista. El segundo miembro de datos contiene el valor, en este caso, el carácter. El tercer miembro de datos es un puntero que apunta al siguiente elemento en la lista.

Entonces, cada personaje, como 'G' arriba, sería retenido por el segundo miembro de datos de una estructura. En el caso de la lista original, LB anterior, y para 'G', el primer miembro de datos de la estructura, apuntaría al elemento que tiene 'f', y el tercer miembro de datos de la estructura apuntaría al elemento que tiene 'H'.

Insertar y Emplace

Cuando insertar () tiene que copiar como se expresa anteriormente, el elemento de 'g', i.mi., La estructura completa, se copiará y colocará frente al elemento 'D', en teoría. En la práctica, después de que se considera que un nuevo elemento correspondiente se coloca frente al elemento 'D', el tercer miembro de datos de la nueva estructura de G señalará el elemento 'D'; y se hará que el primer miembro de datos de la nueva estructura de G señale el elemento 'C' (de List la).

Cuando Insert () tiene que moverse como se expresa anteriormente, la copia como se explica aquí se hace, entonces se elimina el elemento 'G' en la lista LB.

Emplace (), por otro lado, realmente no tiene que copiar ni mover ningún elemento. Solo tiene que indicarse al programa que el valor de interés es el carácter, 'g'. El programa construirá un nuevo elemento con 'G' como el valor delante del elemento 'D' en la lista, LA. Es decir, creará una nueva estructura 'g' frente al elemento 'd', con el tercer miembro de datos apuntando al elemento 'd' y al primer miembro de datos apuntando al elemento 'c', como parte del procedimiento de construcción.

Entonces, la principal diferencia entre Insert () y emPlace () es que emPlace () construye el elemento de inserción en el punto, mientras que Insert () tiene que copiar o mover el elemento.

Este artículo explica qué es el mapa y cómo usar las dos funciones de mapa de los dos miembros de Emplace.

Contenido del artículo

  • El elemento mapa
  • a_uniq.Emplace (args)
  • a.emplace_hint (P, args)
  • Conclusión

El elemento mapa

Los siguientes son cuatro nombres de frutas y sus colores exteriores:

plátano => amarillo
Fruta de la pasión => morado
sandía => verde
uva => rosa

Un mapa consta de pares de clave/valor. En esta lista ordinaria, los nombres de las frutas son las claves, y los nombres de los colores externos son los valores. Sin embargo, esta es una lista de pares, no una lista de valores solo, y no una lista de claves solas. Es una lista de pares de clave/valor. Las teclas de un mapa son únicas.

En código, una clave y su valor se codifican como un elemento, llamado par. Cada elemento sería señalado por un iterador. Entonces, un elemento de mapa ve una clave como un valor, y la clave corresponde a otro valor. Entonces, un elemento de mapa necesita dos valores para crear un elemento; no uno como se expresa en la introducción anterior. Estos dos valores están en algún código, llamado par.

La plantilla para el elemento mapa es:

par

El primer parámetro es para la clave, y se indica como key_type. El segundo parámetro es para el valor que corresponde a la clave. Se indica como mapped_type y no value_type. value_type es en realidad:

par

la plantilla del elemento. Con la matriz, los índices son a los valores. Con el mapa, los iteradores son para parejas. Un par es un valor, que puede mantener el segundo miembro de datos de una estructura, y el tercer miembro de datos apunta al siguiente elemento, que también tiene un par como valor; y el primer miembro de datos que apunta al elemento anterior, cuyo valor es otro par.

En la lista de frutas/colores anteriores, el primer par se puede codificar de la siguiente manera:

"plátano", "amarillo"

"Banana" es la clave, y "amarillo" es el valor, formando un par de clave/valor. Toda la lista corta de dos valores es un valor de value_type, y puede ser mantenida por el miembro de datos medios de un elemento estructural. El primer miembro de datos de la estructura apuntará al elemento anterior, y el tercer miembro de datos de la estructura apuntará al siguiente elemento.

Ahora, un par es un objeto cuya clave tiene el nombre del miembro primero y cuyo valor tiene el nombre del miembro segundo.

El siguiente programa coloca la lista anterior de frutas/colores en un mapa:

#incluir
#incluir
usando el espacio de nombres STD;
int main ()

mapa mp = "plátano", "amarillo", "pasión fruta", "púrpura", "satermelon", "verde", "uva", "rosa";
para (mapa:: iterator it = mp.comenzar(); él != MP.fin(); IT ++)
cout << it->primero << " => " << it->segundo << endl;
regresar 0;

La salida es:

plátano => amarillo
Fruta de la pasión => morado
sandía => verde
uva => rosa

Tenga en cuenta que la biblioteca de mapas tenía que ser incluida.

Pareja heterogénea

Un par no debe tener necesariamente una clave y un valor que tenga sentido para el usuario ordinario. También puede tener una clave y un valor que no tiene sentido para el usuario ordinario, pero tiene sentido para el programador. Como ejemplo para un par de clave/valor que tiene sentido para el programador, la clave puede ser un iterador, y el valor, un tipo de bool.

a_uniq.Emplace (args)

Aquí, a_uniq es el nombre del mapa. Los args son la clave y el valor para el par, separado por una coma. La función miembro devuelve un par, cuyo primer valor es un iterador (value_type); y cuyo segundo valor es un bool, para indicar si la inserción (construida en el lugar) fue exitosa (verdadera para el éxito). El iterador devuelto puntos al elemento insertado. La especificación de C ++ no indica dónde debe tener lugar la inserción dentro de la lista (o delante o detrás) para esta función. El siguiente programa ilustra el uso de la función:

#incluir
#incluir
usando el espacio de nombres STD;
int main ()

mapa mp = "plátano", "amarillo", "pasión fruta", "púrpura", "satermelon", "verde", "uva", "rosa";
par:: iterator, bool> pr = mp.Emplace ("Strawberry", "Rojo");
cout << (pr.first)->primero << " => " << (pr.first)->segundo << " : " << pr.second << endl;
cout << endl;
para (mapa:: iterator it = mp.comenzar(); él != MP.fin(); IT ++)
cout << it->primero << " => " << it->segundo << endl;
regresar 0;

La salida es:

fresa => rojo: 1
fresa => rojo
plátano => amarillo
Fruta de la pasión => morado
sandía => verde
uva => rosa

1 en la primera línea de salida significa verdadero. Tenga en cuenta cómo Args fue codificado como ("Strawberry", "Rojo"). No confunda entre value_type y mapeado _type.

a.emplace_hint (P, args)

Aquí, 'A' es el nombre del mapa. Esta función miembro es similar a la anterior, pero se sugiere la posición donde se debe tener lugar el emplazamiento en la lista de mapas. Es un iterador, p que apunta al elemento antes y cerca del cual se colocará la inserción (emplazamiento), en la memoria. La función devuelve un iterador y no un par. El iterador apunta al elemento recién insertado (par). El siguiente programa ilustra esto:

#incluir
#incluir
usando el espacio de nombres STD;
int main ()

mapa mp = "plátano", "amarillo", "pasión fruta", "púrpura", "satermelon", "verde", "uva", "rosa";
mapa:: iterador p = MP.fin();
pag--;
mapa:: iterator iter = mp.emplace_hint (p, "fresa", "rojo");
cout << iter->primero << " => " << iter->segundo << endl;
cout << endl;
para (mapa:: iterator it = mp.comenzar(); él != MP.fin(); IT ++)
cout << it->primero << " => " << it->segundo << endl;
regresar 0;

La salida es:

fresa => rojo
fresa => rojo
plátano => amarillo
Fruta de la pasión => morado
sandía => verde
uva => rosa

Conclusión

Emplace e Insert son similares. Emplace construye su elemento en el lugar en la lista, después de obtener el valor, de alguna manera. Por otro lado, inserte copia su elemento en la lista desde algún lugar o mueve el elemento a la lista desde algún lugar.

Nota: un mapa se crea normalmente ordenado por teclas. Para lograr esto para el mapa anterior, use objetos de cadena para las claves en lugar de constantes pointers a Chars.