Jaka jest różnica między std:: multimap a std:: map>

Odkryłem, że mają jeden klucz i wiele wartości, które są unikalne.

Author: Drew Noakes, 2011-12-22

4 answers

Multimap przechowuje pary (key, value), gdzie zarówno klucz, jak i wartość mogą pojawić się kilka razy.

map<key, set<value>> będzie przechowywać każdą wartość tylko raz dla określonego klucza. Aby to zrobić, musi być w stanie porównać wartości, a nie tylko klucze.

To zależy od twojej aplikacji, czy wartości, które są równe są równoważne, lub czy chcesz je przechowywać osobno. Być może zawierają pola, które są różne, ale nie biorą udziału w porównaniu dla zestawu.

 52
Author: Bo Persson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-26 20:58:01

A {[2] } jest kontenerem asocjacyjnym, który pozwala na przypisanie unikalnego klucza do wartości type. 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;
}

A std::multimap jest równe a std::map, ale twoje klucze nie są już unikalne. Dlatego możesz znaleźć szereg przedmiotów zamiast tylko znaleźć 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 nie przechowuje klucza związanego z wartością. Przechowuje tylko typ klucza i zapewnia, że jest unikalny w zestawie.

Ty również std::multiset, który podąża za tym samym wzorem.

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

 75
Author: typedef,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-12 10:47:56
map::insert

Ponieważ kontenery map nie pozwalają na duplikowanie wartości klucza, operacja wstawiania sprawdza dla każdego wstawionego elementu, czy w kontenerze istnieje już inny element o tej samej wartości klucza, jeśli tak, element nie jest wstawiany i jego zmapowana wartość nie jest zmieniana w żaden sposób.

Z drugiej strony

multimap::insert 

Może wstawić dowolną liczbę elementów z tym samym klucz.

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

 13
Author: Luka Rahne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-23 19:22:30

Ta ostatnia wymaga, aby wartości można było uporządkować (albo za pomocą {[0] } lub funkcji porównawczej), pierwsza Nie.

 10
Author: Björn Pollex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-26 04:15:27