¿Cuál es la diferencia entre std::multimapa y estándar::mapa >

4 minutos de lectura

avatar de usuario
大宝剑

Descubrí que tienen una clave y múltiples valores que son únicos.

avatar de usuario
definición de tipo

A std::map es un contenedor asociativo que le permite tener una clave única asociada con su valor de tipo. Por ejemplo,

void someFunction()
{
    typedef std::map<std::string, int> MapType;
    MapType myMap;

    // insertion
    myMap.insert(MapType::value_type("test", 42));
    myMap.insert(MapType::value_type("other-test", 0));

    // search
    auto it = myMap.find("test");
    if (it != myMap.end())
        std::cout << "value for " << it->first << " is " << it->second << std::endl;
    else
        std::cout << "value not found" << std::endl;
}

A std::multimap es igual a un std::map, pero sus claves ya no son únicas. Por lo tanto, puede encontrar una variedad de artículos en lugar de solo encontrar un artículo único. Por ejemplo,

void someFunction()
{
    typedef std::multimap<std::string, int> MapType;
    MapType myMap;

    // insertion
    myMap.insert(MapType::value_type("test", 42));
    myMap.insert(MapType::value_type("test", 45));
    myMap.insert(MapType::value_type("other-test", 0));

    // search
    std::pair<auto first, auto second> range = myMap.equal_range("test");
    for (auto it = range.first; it != range.second; ++it)
        std::cout << "value for " << it->first << " can be " << it->second << std::endl;
}

los std::set es como un std::map, pero no está almacenando una clave asociada a un valor. Almacena solo el tipo de clave y le asegura que es único dentro del conjunto.

también tienes la std::multisetque sigue el mismo patrón.

Todos estos contenedores proporcionan un acceso O(log(n)) con su find / equal_range.

  • En la función multimapa, esta línea std::pair<auto first, auto second> range = myMap.equal_range("test"); no funciona, porque error: 'auto' not allowed in template argument. Usar const auto range = myMap.equal_range("test") en cambio.

    – vancexu

    02/03/2014 a las 17:15

  • ¿tipo de mapa? ¿No debería ser MapType en la línea 4?

    – lolololol ol

    17 oct 2016 a las 15:16

  • No estoy seguro de quién fue el primero, pero uno es obviamente una copia y pega del otro: cppbuzz.com/Cuál-es-la-diferencia-entre-mapa-y-multimapa

    – 463035818_no_es_un_número

    11 de enero de 2018 a las 14:07

  • ahah, cppbuzz está raspando StackOverflow o qué?, Escribí esta respuesta hace años cuando todavía estaba programando a diario en c ++. Y de hecho hay un error tipográfico en la línea 4, gracias @lololololol

    – typedef

    12 de enero de 2018 a las 10:46


  • (y su copia/pegado falló, ni siquiera muestran los tipos en la plantilla std::map declaración: std::map)

    – typedef

    12 de enero de 2018 a las 10:54


avatar de usuario
bo persona

El mapa múltiple almacena pares de (clave, valor) donde tanto la clave como el valor pueden aparecer varias veces.

los map<key, set<value>> solo almacenará cada valor una vez para una clave específica. Para hacer eso, tendrá que poder comparar los valores, no solo las claves.

Depende de su aplicación si los valores que comparan iguales son equivalentes, o si desea almacenarlos por separado de todos modos. Quizá contengan campos que sean diferentes pero que no participen en la comparación del conjunto.

  • Entonces, un std::multimap es como un std::map >, la diferencia entre ellos es que los valores posteriores están ordenados. ¿Está bien?

    – 大宝剑

    22 de diciembre de 2011 a las 15:56

  • No, std::multimap<key, value> permite que la misma tecla aparezca varias veces, mientras que std::map<key, whatever> requiere la singularidad de key.

    – Yixing Liu

    13 de julio de 2018 a las 15:25


avatar de usuario
luka rahne

map::insert

Porque map Los contenedores no permiten valores de clave duplicados, la operación de inserción verifica para cada elemento insertado si ya existe otro elemento en el contenedor con el mismo valor de clave, si es así, el elemento no se inserta y su valor asignado no cambia de ninguna manera.

por otra parte

multimap::insert 

Puede insertar cualquier número de artículos con la misma tecla.

http://www.cplusplus.com/reference/stl/map/
http://www.cplusplus.com/reference/stl/multimap/

  • Buen enlace sobre la diferencia y cómo funciona internamente. Enlace

    – Rndp13

    29 de mayo de 2015 a las 5:46

avatar de usuario
Björn Pollex

Este último requiere que los valores se puedan ordenar (ya sea a través de operator< o una función de comparación), la primera no.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad