2010-12-14 14 views
54

No entiendo por qué existe el multimapa si podemos crear un mapa de vectores o un mapa de conjuntos. Para mí únicas diferencias son:¿Cuál es la ventaja de multimap sobre el mapa de vectores?

  • usando equal_range en multimap para obtener elementos de una llave y en el mapa de vectores que simplemente utilizar [] operador y tienen vectorial de los elementos.
  • usando multimap.insert(make_pair(key,value)) en multimap para agregar elementos y map_of_vectors[key].push_back(value) en el mapa de vectores.

¿Por qué utilizar multimap? Para mí, es mejor tener un vector que dos iteradores para obtener todos los valores de una clave.

Esta pregunta se aplica también a unordered_map of vectors y unordered_multimap.

+6

Debo admitir que nunca entendí bien el propósito de 'multimap':/ –

+0

Llegué un poco tarde en la pregunta pero también el multimap consume mucha más memoria que el mapa de vectores debido a los punteros adicionales.La única razón por la que los usaría es si quiero mantener la clave de cada elemento (haciendo 'push_back' no lo mantendrá) – Jcao02

+0

Multimap es genial si no solo quiere hacer un seguimiento de las claves duplicadas de diferentes valores, pero también desea eliminar cualquier par clave/valor en un momento previo aviso. Un mapa de vectores no es adecuado para eso, y aunque puede usar un mapa de listas, es más conveniente usar un multimapa. – richizy

Respuesta

42

Yo diría que depende de si todos los valores con la misma clave tienen una relación que desea abordar.

Así que, por ejemplo, ¿a menudo revisas todos los elementos con la tecla X o los pasas a una función, y así sucesivamente? Entonces es más conveniente tenerlos ya en su contenedor separado, que puede abordar directamente.

Sin embargo, si solo tiene una colección de elementos, que pueden compartir el mismo valor de clave, o no, ¿por qué usar vectores en el medio? Es más conveniente ejecutar a través del multimapa con iteradores que tener un ciclo anidado para el mapa, caso vectorial.

Otra forma de ver esto: si las entradas múltiples por clave son muy comunes, su estructura es más eficiente en el mapa, caso de vectores. Si rara vez ocurren, es todo lo contrario.

+2

Gracias. Tu respuesta y la de Artyom me mostraron un poco más de diferencias. Sin embargo, todavía no creo que el multimap sea tan útil en la vida real como el mapa de vectores. Pero esa es mi opinión personal;) –

-1

dos iteradores ??? Creo que estas equivocado.

cuando uso std :: for_each() u otro tipo de algoritmo en un multimapa, utilizo solo UN rango de iteradores, y es mucho más simple que preocuparse con un vector para cada clave.

40

Hay muchas diferencias importantes entre multimap<x, y> y map<x, vector<y>>

Una vez que ha insertado un valor en multimap, usted sabe que el iterador permanecería válida hasta que lo elimine y esto es propiedad muy fuerte, que pueda No lo tengo con el mapa de vectores.

multimap<x,y>::iterator p=mymap.insert(make_pair(a,b)); 

El iterador sigue siendo válida hasta que se borra del mapa, mientras que en el segundo caso, sería invalidado cada vez que añada nueva entrada al vector.

También tenga en cuenta que map<x, vector<y>> puede tener un valor vacío establecido con la clave existente, mientras que multimap no lo hace.

Estas son cosas diferentes que se comportan de manera diferente.

Y para ser sincero, echo de menos el multimapa en algunos idiomas que no lo proporcionan en su biblioteca.

Cuestiones relacionadas