Multimap vs Map en C++ STL con ejemplos

Mapa en C++ STL

El mapa almacena pares clave-valor únicos de forma ordenada. Cada clave está asociada de forma única con un valor que puede o no ser único. Una clave se puede insertar o eliminar de un mapa, pero no se puede modificar. Los valores asignados a las teclas se pueden cambiar. Es una excelente manera de acceder rápidamente al valor usando la tecla y se realiza en tiempo O (1). 

C++

#include <iostream>
#include <iterator>
#include <map>
  
using namespace std;
  
int main()
{
  
    // empty map container
    map<int, int> gquiz1;
  
    // insert elements in random order
    gquiz1.insert(pair<int, int>(1, 40));
    gquiz1.insert(pair<int, int>(2, 30));
    gquiz1.insert(pair<int, int>(3, 60));
    gquiz1.insert(pair<int, int>(4, 20));
    gquiz1.insert(pair<int, int>(5, 50));
    gquiz1.insert(pair<int, int>(6, 50));
    gquiz1.insert(pair<int, int>(7, 10));
  
    // printing map gquiz1
    map<int, int>::iterator itr;
    cout << "\nThe map gquiz1 is : \n";
    cout << "\tKEY\tELEMENT\n";
    for (itr = gquiz1.begin(); itr != gquiz1.end(); ++itr) {
        cout << '\t' << itr->first
             << '\t' << itr->second << '\n';
    }
    cout << endl;
  
    // assigning the elements from gquiz1 to gquiz2
    map<int, int> gquiz2(gquiz1.begin(), gquiz1.end());
  
    // print all elements of the map gquiz2
    cout << "\nThe map gquiz2 after"
         << " assign from gquiz1 is : \n";
    cout << "\tKEY\tELEMENT\n";
    for (itr = gquiz2.begin(); itr != gquiz2.end(); ++itr) {
        cout << '\t' << itr->first
             << '\t' << itr->second << '\n';
    }
    cout << endl;
  
    // remove all elements up to
    // element with key=3 in gquiz2
    cout << "\ngquiz2 after removal of"
            " elements less than key=3 : \n";
    cout << "\tKEY\tELEMENT\n";
    gquiz2.erase(gquiz2.begin(), gquiz2.find(3));
    for (itr = gquiz2.begin(); itr != gquiz2.end(); ++itr) {
        cout << '\t' << itr->first
             << '\t' << itr->second << '\n';
    }
  
    // remove all elements with key = 4
    int num;
    num = gquiz2.erase(4);
    cout << "\ngquiz2.erase(4) : ";
    cout << num << " removed \n";
    cout << "\tKEY\tELEMENT\n";
    for (itr = gquiz2.begin(); itr != gquiz2.end(); ++itr) {
        cout << '\t' << itr->first
             << '\t' << itr->second << '\n';
    }
  
    cout << endl;
  
    // lower bound and upper bound
    // for map gquiz1 key = 5
    cout << "gquiz1.lower_bound(5) : "
         << "\tKEY = ";
    cout << gquiz1.lower_bound(5)->first << '\t';
    cout << "\tELEMENT = "
         << gquiz1.lower_bound(5)->second << endl;
    cout << "gquiz1.upper_bound(5) : "
         << "\tKEY = ";
    cout << gquiz1.upper_bound(5)->first << '\t';
    cout << "\tELEMENT = "
         << gquiz1.upper_bound(5)->second << endl;
  
    return 0;
}
Producción

El mapa gquiz1 es:
ELEMENTO CLAVE
1 40
2 30
3 60
4 20
5 50
6 50
7 10

El mapa gquiz2 después de asignar desde gquiz1 es:
ELEMENTO CLAVE
1 40
2 30
3 60
4 20
5 50
6 50
7 10

gquiz2 después de la eliminación de elementos menores que key=3:
ELEMENTO CLAVE
3 60
4 20
5 50
6 50
7 10

gquiz2.erase(4): 1 eliminado
ELEMENTO CLAVE
3 60
5 50
6 50
7 10

gquiz1.lower_bound(5) : CLAVE = 5 ELEMENTO = 50
gquiz1.upper_bound(5) : CLAVE = 6 ELEMENTO = 50

Multimapa en C++ STL 

Multimap es similar al mapa con la adición de que varios elementos pueden tener las mismas claves. Además, NO se requiere que el par de valor de clave y valor asignado sea único en este caso. Una cosa importante a tener en cuenta sobre multimapa es que multimapa siempre mantiene todas las claves ordenadas. Estas propiedades de multimapa lo hacen muy útil en la programación competitiva.

C++

#include <iostream>
#include <iterator>
#include <map>
  
using namespace std;
  
int main()
{
    // empty multimap container
    multimap<int, int> gquiz1;
  
    // insert elements in random order
    gquiz1.insert(pair<int, int>(1, 40));
    gquiz1.insert(pair<int, int>(2, 30));
    gquiz1.insert(pair<int, int>(3, 60));
    gquiz1.insert(pair<int, int>(6, 50));
    gquiz1.insert(pair<int, int>(6, 10));
  
    // printing multimap gquiz1
    multimap<int, int>::iterator itr;
    cout << "\nThe multimap gquiz1 is : \n";
    cout << "\tKEY\tELEMENT\n";
    for (itr = gquiz1.begin(); itr != gquiz1.end(); ++itr) {
        cout << '\t' << itr->first
             << '\t' << itr->second << '\n';
    }
    cout << endl;
  
    // adding elements randomly,
    // to check the sorted keys property
    gquiz1.insert(pair<int, int>(4, 50));
    gquiz1.insert(pair<int, int>(5, 10));
  
    // printing multimap gquiz1 again
  
    cout << "\nThe multimap gquiz1 after"
         << " adding extra elements is : \n";
    cout << "\tKEY\tELEMENT\n";
    for (itr = gquiz1.begin(); itr != gquiz1.end(); ++itr) {
        cout << '\t' << itr->first
             << '\t' << itr->second << '\n';
    }
    cout << endl;
  
    // assigning the elements from gquiz1 to gquiz2
    multimap<int, int> gquiz2(gquiz1.begin(),
                              gquiz1.end());
  
    // print all elements of the multimap gquiz2
    cout << "\nThe multimap gquiz2 after"
         << " assign from gquiz1 is : \n";
    cout << "\tKEY\tELEMENT\n";
    for (itr = gquiz2.begin(); itr != gquiz2.end(); ++itr) {
        cout << '\t' << itr->first
             << '\t' << itr->second << '\n';
    }
    cout << endl;
  
    // remove all elements up to
    // key with value 3 in gquiz2
    cout << "\ngquiz2 after removal of"
         << " elements less than key=3 : \n";
    cout << "\tKEY\tELEMENT\n";
    gquiz2.erase(gquiz2.begin(), gquiz2.find(3));
    for (itr = gquiz2.begin(); itr != gquiz2.end(); ++itr) {
        cout << '\t' << itr->first
             << '\t' << itr->second << '\n';
    }
  
    // remove all elements with key = 4
    int num;
    num = gquiz2.erase(4);
    cout << "\ngquiz2.erase(4) : ";
    cout << num << " removed \n";
    cout << "\tKEY\tELEMENT\n";
    for (itr = gquiz2.begin(); itr != gquiz2.end(); ++itr) {
        cout << '\t' << itr->first
             << '\t' << itr->second << '\n';
    }
  
    cout << endl;
  
    // lower bound and upper bound
    // for multimap gquiz1 key = 5
    cout << "gquiz1.lower_bound(5) : "
         << "\tKEY = ";
    cout << gquiz1.lower_bound(5)->first << '\t';
    cout << "\tELEMENT = "
         << gquiz1.lower_bound(5)->second
         << endl;
    cout << "gquiz1.upper_bound(5) : "
         << "\tKEY = ";
    cout << gquiz1.upper_bound(5)->first << '\t';
    cout << "\tELEMENT = "
         << gquiz1.upper_bound(5)->second
         << endl;
  
    return 0;
}
Producción

El multimapa gquiz1 es:
ELEMENTO CLAVE
1 40
2 30
3 60
6 50
6 10

El multimapa gquiz1 después de agregar elementos adicionales es:
ELEMENTO CLAVE
1 40
2 30
3 60
4 50
5 10
6 50
6 10

El multimapa gquiz2 después de la asignación de gquiz1 es:
ELEMENTO CLAVE
1 40
2 30
3 60
4 50
5 10
6 50
6 10

gquiz2 después de la eliminación de elementos menores que key=3:
ELEMENTO CLAVE
3 60
4 50
5 10
6 50
6 10

gquiz2.erase(4): 1 eliminado
ELEMENTO CLAVE
3 60
5 10
6 50
6 10

gquiz1.lower_bound(5) : CLAVE = 5 ELEMENTO = 10
gquiz1.upper_bound(5) : CLAVE = 6 ELEMENTO = 50

Diferencia entre Map y Multimap en C++ STL

No. S.  Mapa multimapa
1 Almacena un par clave-valor único donde cada clave es única. Puede almacenar pares clave-valor duplicados donde las claves pueden no ser únicas.
2 El uso de la función count() en un mapa solo puede devolver dos valores, que es 0 o 1. El uso de la función count() en un mapa múltiple puede devolver cualquier número entero no negativo.
3 Acceder al valor de cualquier clave es fácil y directamente accesible. Acceder al valor de cualquier clave no es fácil y no es directamente accesible.
4 Eliminar en un mapa usando clave eliminará solo un par clave-valor. Eliminar en un mapa múltiple usando la clave eliminará todo el par clave-valor que tenga la misma clave.
5 El mapa se puede usar cuando se requiere una tabla de búsqueda simple que tenga pares clave-valor únicos para acceder rápidamente al valor usando la clave. Multimap se puede usar cuando se requiere agrupar valores usando las claves.

Publicación traducida automáticamente

Artículo escrito por varshapoddar2402 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 *