2010-12-14 14 views
54

Nie rozumiem, dlaczego istnieje multimap, jeśli możemy utworzyć mapę wektorów lub mapę zbiorów. Dla mnie tylko różnice to:Jaka jest zaleta multimapy nad mapą wektorów?

  • użyciu equal_range w multimapy uzyskania elementy klucza i na mapie wektorów używamy po prostu [] operatora i mieć wektor elementów.
  • przy użyciu multimap.insert(make_pair(key,value)) w multimapie do dodawania elementów i map_of_vectors[key].push_back(value) na mapie wektorów.

Dlaczego warto korzystać z multimapy? Dla mnie lepiej jest mieć wektor niż dwa iteratory, aby uzyskać wszystkie wartości klucza.

To pytanie dotyczy także niepisanej mapy wektorów i nieuporządkowanej_multimy.

+6

Muszę przyznać, że nigdy nie rozumiałem, do czego służy funkcja "multimap":/ –

+0

Jestem trochę spóźniona, ale również multimapa zużywa o wiele więcej pamięci niż mapa wektorów dzięki dodatkowym wskaźnikom.Jedynym powodem, dla którego bym ich użył, jest to, że chcę zachować klucz każdego elementu (robi 'push_back', którego nie zatrzymasz) – Jcao02

+0

Multimap jest świetny, jeśli chcesz nie tylko śledzić zduplikowane klucze o różnych wartościach, ale jednocześnie chcesz usunąć parę kluczy/wartości za jednym razem. Mapa wektorów nie jest do tego odpowiednia i chociaż można użyć mapy list, wygodniej jest po prostu użyć multimapy. – richizy

Odpowiedz

42

Powiedziałbym, że to zależy od tego, czy wszystkie wartości z tym samym kluczem mają związek, który chcesz adresować.

Czy na przykład często przeglądasz wszystkie elementy za pomocą klawisza X lub przekazujesz je do funkcji i tak dalej? Wtedy wygodniej jest mieć je już w osobnym pojemniku, aby można było adresować bezpośrednio.

Jeśli jednak masz kolekcję przedmiotów, które mogą mieć tę samą wartość klucza lub nie, po co używać wektorów? Bardziej wygodne jest przeglądanie multimapy z iteratorami niż zagnieżdżanie dla pętli dla mapy, przypadku wektorowego.

Inny sposób patrzenia na to: jeśli wiele wpisów na klucz jest bardzo powszechne, twoja struktura jest bardziej efektywna na mapie, przypadek wektorowy. Jeśli rzadko się zdarzają, jest odwrotnie.

+2

Dzięki. Twoja odpowiedź i Artema pokazała mi trochę więcej różnic. Jednak nadal nie wierzę, że multimap jest tak samo użyteczny w prawdziwym życiu, jak mapa wektorów. Ale to moja osobista opinia;) –

-1

dwa iteratory ??? Myślę że się mylisz.

kiedy używam std :: for_each() lub innego algo na multimapie Używam tylko JEDNEGO zakresu iteratora, i cholernie dużo łatwiej jest martwić się wektorem dla każdego klawisza.

40

Istnieje wiele istotnych różnic pomiędzy multimap<x, y> i map<x, vector<y>>

Gdy już wstawiony wartość do multimapy, wiesz, że iterator pozostanie obowiązuje do momentu jej usunięcia, a to jest bardzo silny nieruchomość, można nie ma go z mapą wektorów.

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

Iterator pozostaje ważny, dopóki nie zostanie wymazane z mapy, podczas gdy w drugim przypadku, byłoby unieważnione po każdym dodaniu nowego wpisu do wektora.

Należy również pamiętać, że map<x, vector<y>> może mieć pustą wartość ustawioną przy użyciu istniejącego klucza, podczas gdy multimapa nie.

Są to różne rzeczy, które zachowują się inaczej.

Szczerze mówiąc, brakuje mi multimapy w niektórych językach, które jej nie udostępniają w swojej bibliotece.

Powiązane problemy