Unordered_map ::emplace() es una función integrada en C++ STL que inserta la clave y su elemento en el contenedor unordered_map. Aumenta efectivamente el tamaño del contenedor en uno. Si la misma clave se coloca más de una vez, el mapa almacena el primer elemento solo porque el mapa es un contenedor que no almacena varias claves del mismo valor.
¿En qué se diferencia de unordered_map insert()?
La ventaja de emplace es que realiza una inserción en el lugar y evita una copia innecesaria del objeto. Para tipos de datos primitivos, no importa cuál usemos. Consulte esto para obtener más detalles.
Sintaxis:
unordered_map_name.emplace(key, element)
Parámetros: La función acepta dos parámetros obligatorios que se describen a continuación:
- clave: especifica la clave que se insertará en el contenedor multimapa.
- elemento: especifica el elemento de la clave que se insertará en el contenedor del mapa.
Valores devueltos : Devuelve un par de un iterador y un bool. Si el elemento ya existe, devuelve un iterador que apunta al elemento ya insertado y si el elemento no existe, devuelve un iterador al contenedor recién agregado. El booleano representa si la inserción tuvo lugar o no.
El siguiente programa ilustra el funcionamiento de la función emplace :
Ejemplo 1:
// C++ program for the illustration of // unordered_map::emplace() function #include <bits/stdc++.h> using namespace std; int main() { // initialize container unordered_map<int, int> mp; // insert elements in random order mp.emplace(2, 30); mp.emplace(1, 40); mp.emplace(2, 20); mp.emplace(1, 50); mp.emplace(4, 50); // prints the elements for (auto it = mp.begin(); it != mp.end(); it++) cout << it->first << "==>>" << it->second << "\n"; }
4==>>50 2==>>30 1==>>40
Ejemplo 2 : Digamos que queremos mostrar todos los caracteres únicos con sus índices para una string. Si un carácter aparece varias veces, muestre el índice en el que apareció primero.
// C++ program for the illustration of // unordered_map::emplace() function #include <bits/stdc++.h> using namespace std; int main() { string str = "geeksforgeeks"; unordered_map<char, int> mp; for (int i = 0; i < str.length(); i++) mp.emplace(str[i], i); for (auto it = mp.begin(); it != mp.end(); it++) cout << it->first << "==>>" << it->second << "\n"; }
r==>>7 e==>>1 s==>>4 g==>>0 k==>>3 f==>>5 o==>>6
Explicación: «g» apareció 2 veces en la string, primero en el índice «0» y luego en el índice «8», pero la función emplace no nos permite guardar en unordered_map hasta que la clave dada sea única. Por eso se guarda “0” y no “8”.
De manera similar, para «e», «1» se guarda y «2», «9», «10» no.