Encontré que tienen una clave y múltiples valores que son únicos.Cuál es la diferencia entre std :: multimap <key, value> y std :: map <key, std :: set <value>>
Respuesta
El multimapa almacena pares de (clave, valor) donde tanto la clave como el valor pueden aparecer varias veces.
El map<key, set<value>>
solo almacenará cada valor una vez para una clave específica. Para hacer eso, tendrá que ser capaz de comparar los valores, no solo las claves.
Depende de su aplicación si los valores que comparan iguales son equivalentes, o si desea guardarlos por separado de todos modos. Quizás contienen campos que son diferentes pero no participan en la comparación del conjunto.
Este último requiere que los valores se puedan pedir (ya sea a través de operator<
o una función de comparación), el primero no.
Parece que el operador
Sí, pero mi respuesta se refería al orden de los valores. Supongamos que tiene un tipo 'T' que no ordena. Puede usarlo para crear un 'std :: multimap ', pero no puede usarlo para crear un 'std :: map >'. –
map::insert
Debido map
recipientes no permiten valores de clave duplicados, los controles de operación de inserción para cada elemento insertado si otro elemento que ya existe en el recipiente con el mismo valor de clave si es así, el elemento no está insertada y de sus mapeados el valor no se cambia de ninguna manera.
por el contrario
multimap::insert
puede insertar cualquier número de elementos con la misma clave.
http://www.cplusplus.com/reference/stl/map/
http://www.cplusplus.com/reference/stl/multimap/
Buen enlace tanto sobre la diferencia como sobre cómo funciona internamente. [enlace] (http: //www.ccplusplus.com/2014/02/how-map-and-multimap-works-c.html) – Rndp13
Un 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;
}
Un std::multimap
es igual a un std::map
, pero las llaves no son exclusivos más. 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;
}
El std::set
es como un std::map
, pero no es el almacenamiento de una clave asociada a un valor. Almacena solo el tipo de clave, y le asegura que es único dentro del conjunto.
También tiene el std::multiset
, que sigue el mismo patrón.
Todos estos contenedores proporcionan un acceso O (log (n)) con su rango de búsqueda/igualdad.
En la función multimap, esta línea 'std :: pair
mapType? ¿No debería ser MapType en la línea 4? –
no estoy seguro de quién fue el primero, pero uno es, obviamente, una copia pegar de la otra: https://www.cppbuzz.com/What-is-difference-between-map-and-multimap – user463035818
- 1. ¿Hay alguna diferencia entre std :: map <int, int> y std :: map <const int, int>?
- 2. ¿Cuál es la diferencia entre std :: set y std :: vector?
- 3. const std :: map <boost :: tuples :: tuple, std :: string>?
- 4. std :: vector <std::string> crash
- 5. Ordenar un std :: vector <std :: pair <std :: string, bool >> por la cadena?
- 6. ¿Cómo se diferencia un multimap STL de .NET Dictionary <key, List <values>>?
- 7. Diferencia entre <string> y <string.h>?
- 8. ¿Cuál es la diferencia entre `key`-global-set y` define-key-map` mundial en Emacs
- 9. std: numeric_limits <double> :: epsilon definition
- 10. std :: move entre std :: string y std :: vector <unsigned char>
- 11. std :: array <char, N> std :: string
- 12. ¿Cuál es la diferencia entre <% %> y <%=%>?
- 13. ¿Cuál es la diferencia entre <%# %> y <%= %>?
- 14. std :: lista <std :: unique_ptr <T>>: que pasa a su alrededor
- 15. Cómo "fundido" un std :: vector <char> std :: vector <wchar_t>
- 16. Python equivalente a std :: set y std :: multimap
- 17. ¿Por qué std :: sub_match <T> hereda públicamente de std :: pair <T, T>?
- 18. ¿Cuál es la diferencia entre std :: merge y std :: set_union?
- 19. ¿Cuál es la diferencia entre std :: valarray y std :: array
- 20. ¿Cuál es la diferencia entre std :: condition_variable y std :: condition_variable_any?
- 21. ¿Están C++ std :: map <string, string> ordenados?
- 22. Cómo guardar `std :: vector <uchar>` en `std :: ostream`?
- 23. Convierte std :: string en std :: vector <char>
- 24. std :: cin.ignore (std :: numeric_limits <std :: streamsize> :: max(), '\ n') de error al utilizar # include <Windows.h>
- 25. vector de std :: función <>
- 26. std :: array <T> inicialización
- 27. Comparación de std :: function <>
- 28. ¿Está std :: list <> :: sort stable?
- 29. C++ std :: stringstream operador << sobrecarga
- 30. diferencia entre <%! %> y <% %>
Entonces, std :: multimap es como un std :: map >, la diferencia entre ellos es que los valores posteriores están ordenados. ¿Está bien? –