2011-12-22 19 views

Odpowiedz

38

Multimap przechowuje pary (klucz, wartość), w których zarówno klucz, jak i wartość mogą pojawić się kilka razy.

Każda wartość zostanie zapisana tylko dla określonego klucza. Aby to zrobić, musi być w stanie porównać wartości, a nie tylko klucze.

To zależy od aplikacji, jeśli wartości, które są porównywalne, są równoważne, lub jeśli mimo to chcesz je przechowywać oddzielnie. Być może zawierają one inne pola, ale nie biorą udziału w porównaniu do zestawu.

+3

Std :: multimap jest podobny do std :: map >, różnica między nimi jest taka, że ​​późniejsze wartości są sortowane. Czy to prawda? –

9

Ta ostatnia wymaga, aby można było zamówić wartości (za pomocą operator< lub funkcji porównania), pierwsza nie.

+0

Wygląda na to, że operator johnbakers

+0

Tak, ale moja odpowiedź dotyczyła kolejności wartości. Załóżmy, że masz typ "T", który nie ma porządku. Możesz go użyć do utworzenia 'std :: multimap ', ale nie możesz użyć do utworzenia 'std :: map >. –

12
map::insert 

Ponieważ map pojemniki nie pozwalają na podwójnych wartości kluczowych, kontrole operacji wstawiania dla każdego elementu wstawionego czy inny element już istnieje w pojemniku z tą samą wartością klucza jeśli tak, element nie jest włożona i jego odwzorowany wartość nie została w żaden sposób zmieniona.

Natomiast

multimap::insert 

na może wstawić dowolną liczbę przedmiotów z tym samym kluczem.

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

+0

Dobry link zarówno na temat różnicy, jak i sposobu działania wewnętrznego. [link] (http: //www.ccplusplus.com/2014/02/how-map-and-multimap-works-c.html) – Rndp13

61

std::map jest asocjacyjne pojemnik, który pozwala mieć unikatowy klucz skojarzony z wartości znamionowej. Na przykład

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; 
} 

std::multimap jest równa std::map, ale klucze nie są już unikatowe. Dlatego możesz znaleźć wiele przedmiotów, zamiast znaleźć tylko jeden unikalny przedmiot. Na przykład

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; 
} 

std::set jest jak std::map, ale to nie jest przechowywanie klucza związanego z wartością. Przechowuje tylko typ klucza i zapewnia, że ​​jest unikalny w zestawie.

Masz również std::multiset, który ma taki sam wzór.

Wszystkie te kontenery zapewniają dostęp do O (log (n)) z ich find/equal_range.

+3

W funkcji multimap, linia 'std :: pair range = myMap.equal_range (" test "); 'nie działa, ponieważ' error: 'auto' jest niedozwolone w argumencie szablonu'. Zamiast tego użyj 'const auto range = myMap.equal_range (" test ")'. – vancexu

+2

mapType? Czy nie powinien to być MapType w linii 4? –

+0

nie jestem pewien, kto był pierwszy, ale jeden jest oczywiście kopią drugiej: https://www.cppbuzz.com/What-is-difference-between-map-and-multimap – user463035818

Powiązane problemy