Insertar elementos en std::map (insert, emplace y operator [])

Requisito previo: Mapa en STL

El mapa es un contenedor, como sugiere el nombre, que se utiliza para almacenar un par clave-valor . El mapa tiene una ventaja sobre otros contenedores por el hecho de que buscar en el mapa , definido por la «clave», solo requiere una complejidad de tiempo O (1) , por lo que es útil en varios campos de codificación. La inserción se trata en este artículo.

1. Uso de insert() : la función de inserción se utiliza para insertar el par clave-valor en el mapa. Después de la inserción, se produce el reordenamiento de los elementos y el mapa se ordena según la clave. 

Esta función se implementa de 3 maneras:

  • insert(par) : Esta función inserta el par en el mapa. La inserción solo tiene lugar cuando la clave pasada no está ya insertada. 
    Devuelve un par de punteros. Primer elemento que apunta al par ya presente o recién insertado. Segundo elemento que devuelve el estado booleano «verdadero» o «falso». 
    Complejidad temporal: log(n) donde n es el tamaño del mapa
  • insertar (sugerencia, par) : en esta implementación, el puntero de la sugerencia se envía con el par que se insertará. El uso de un puntero de sugerencia es para ayudar a insert() a saber dónde debe tener lugar la inserción real. Por lo tanto, tratar de reducir el tiempo para asignar el par. 
    El puntero de sugerencia no fuerza la inserción en una posición específica. Esta función devuelve el puntero a la posición donde se inserta el par. 
    Complejidad de tiempo: log(n) donde n es el tamaño del mapa si la sugerencia es óptima entonces O(1)
  • insert(beg_ptr, end_ptr) : este tipo de inserción es necesaria para insertar los pares de otro contenedor en el mapa. Los pares repetidos no se insertan si están presentes en el contenedor de destino. 
    Complejidad de tiempo: k*log(n) donde n es el tamaño del mapa, k es no. de elementos insertados.

C++

// C++ code to demonstrate the working of insert()
   
#include<iostream>
#include<map> // for map operations
using namespace std;
   
int main()
{
    // declaring map
    // of char and int
    map< char, int > mp;
       
    // declaring iterators
    map<char, int>::iterator it ;
    map<char, int>::iterator it1;
    map<char, int>::iterator it2;
       
    // declaring pair for return value of map containing
    // map iterator and bool
    pair <map<char, int>::iterator, bool> ptr;
       
    // using insert() to insert single pair
    // inserting 'a' with 20
    ptr = mp.insert( pair<char, int>('a', 20) );
       
    // checking if the key was already present or newly inserted
    if(ptr.second)
        cout << "The key was newly inserted" ;
    else
        cout << "The key was already present" ;
       
    cout << endl ;
       
    // printing map pairs after insertion
    cout << "The map pairs after 1st insertion are : \n";
       
    for (it1 = mp.begin(); it1!=mp.end(); ++it1)
        cout << it1->first << "->" << it1->second << endl;
       
    it = mp.begin();
       
    // inserting map pair using hint 
    mp.insert(it, pair<char, int>('b', 24) );
       
    cout << endl ;
       
    // printing map pairs after insertion
    cout << "The map pairs after 2nd insertion are : \n";
       
    for (it1 = mp.begin(); it1!=mp.end(); ++it1)
        cout << it1->first << "->" << it1->second << endl;
       
    // initializing another map 
    map<char, int> mp2;
       
    // using insert(beg_iter, end_iter) to copy all elements
    mp2.insert(mp.begin(), mp.end());
       
    cout << endl ;
       
    // printing new map pairs after insertion
    cout << "The new map pairs after insertion are : \n";
       
    for (it1 = mp2.begin(); it1!=mp2.end(); ++it1)
        cout << it1->first << "->" << it1->second << endl;
       
}
The key was newly inserted
The map pairs after 1st insertion are : 
a->20

The map pairs after 2nd insertion are : 
a->20
b->24

The new map pairs after insertion are : 
a->20
b->24

2. Usando emplace : emplace también se usa para insertar los pares en el mapa. Esta función es similar a «insertar()» discutida anteriormente, la única diferencia es que la construcción «en el lugar» del par se lleva a cabo en la posición de inserción del elemento al contrario de insertar() que copia o filma el objeto existente. 

  • emplace() : inserta pares usando una estrategia de construcción en el lugar. Aumenta el tamaño del mapa en 1. devuelve un par de punteros. El primer elemento del cual es un iterador que apunta a la posición del par insertado. 2nd devuelve una variable booleana que indica un par ya presente o recién creado.
    Complejidad de tiempo: log(n) (n es el tamaño del mapa)
  • emplace_hint() : Toma un «hint_iterator» para obtener una pista de la posición de inserción para posiblemente reducir el tiempo requerido para insertar el par insertado. Esto no afecta la posición de inserción. Tiene lugar donde se define internamente.
    Complejidad de tiempo: log(n) (n es el tamaño del mapa), si la sugerencia es óptima entonces O(1)

C++

// C++ code to demonstrate the working of emplace()
// and emplace_hint()
#include<iostream>
#include<map> // for map operations
using namespace std;
   
int main()
{
    // declaring map
    map<char, int> mp;
       
    // declaring iterators
    map<char, int>::iterator it;
    map<char, int>::iterator it1;
    map<char, int>::iterator it2;
       
    // declaring pair for return value of map containing
    // map iterator and bool
    pair< map<char, int>::iterator, bool> ptr;
       
    // using emplace() to insert pair element
    // inserting 'a' to 24
    // no "pair" needed, in-place construction
    ptr = mp.emplace('a', 24);
       
    // checking if the pair was already present or newly inserted
    // returns true. newly inserted
    if (ptr.second)
        cout << "The key was newly inserted" ;
    else
        cout << "The key was already present" ;
       
    cout << endl;
       
    // printing map pairs after insertion
    cout << "The map pairs after 1st insertion are : \n";
       
    for (it1 = mp.begin(); it1!=mp.end(); ++it1)
        cout << it1->first << "->" << it1->second << endl;
       
    cout << endl ;
       
    // using emplace() to insert single pair
    // inserting a to 24 // not inserted this time
    ptr = mp.emplace('a', 24);
       
    // checking if the key was already present or newly inserted
    // returns false. already inserted
    if(ptr.second)
        cout << "The key was newly inserted" ;
    else
        cout << "The key was already present" ;
       
    cout << endl ;
       
    // printing map pairs after insertion
    cout << "The map pairs after 2nd insertion are : \n";
       
    for (it1 = mp.begin(); it1!=mp.end(); ++it1)
        cout << it1->first << "->" << it1->second << endl;
       
    it = mp.begin();
       
    // inserting map pair using hint
    mp.emplace_hint(it, 'b', 20);
       
    cout << endl ;
       
    // printing map pairs after insertion
    cout << "The map pairs after 3rd insertion are : \n";
       
    for (it1 = mp.begin(); it1!=mp.end(); ++it1)
        cout << it1->first << "->" << it1->second << endl;
   
       
}

Producción:

The key was newly inserted
The map pairs after 1st insertion are : 
a->24

The key was already present
The map pairs after 2nd insertion are : 
a->24

The map pairs after 3rd insertion are : 
a->24
b->20

3. Usando el operador [] : «[]» también se puede usar para insertar elementos en el mapa. Similar a las funciones anteriores y devuelve el puntero al elemento recién construido. La diferencia es que este operador siempre construye un nuevo elemento , es decir, incluso si un valor no está asignado a una clave, se llama al constructor predeterminado y asigna un valor «nulo» o «vacío» a la clave. El tamaño del mapa siempre es aumentado en 1
Complejidad temporal: log(n) donde n es el tamaño del mapa

C++

// C++ code to demonstrate the working of operator[]
 
#include<iostream>
#include<map> // for map operations
using namespace std;
 
int main()
{
    // declaring map
    map<char, int> mp;
     
    // using [] to assign key to value
    mp['a'] = 5;
    mp['b'] = 6;
    mp['c'] = 2;
     
    // printing values
    cout << "The element keys to a is : ";
    cout << mp['a'] << endl;
     
    cout << "The element keys to b is : ";
    cout << mp['b'] << endl;
     
    cout << "The element keys to c is : ";
    cout << mp['c'] << endl;
     
    // default constructor is called
    // prints 0
    cout << "The element keys to d is : ";
    cout << mp['d'] << endl;
     
     
}

Producción: 

The element keys to a is : 5
The element keys to b is : 6
The element keys to c is : 2
The element keys to d is : 0

Artículo relacionado : Búsqueda en Map STL C++

Este artículo es una contribución de Manjeet Singh . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *