В чем разница между std :: multimap <ключ, значение> и std :: map <ключ, std :: set <value>> - PullRequest
75 голосов
/ 22 декабря 2011

Я обнаружил, что они имеют один ключ и несколько значений, которые являются уникальными.

Ответы [ 4 ]

69 голосов
/ 22 декабря 2011

A std::map - это ассоциативный контейнер, который позволяет вам иметь уникальный ключ, связанный со значением вашего типа.Например,

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 равно std::map, но ваши ключи больше не являются уникальными.Поэтому вы можете найти ряд предметов, а не просто найти один уникальный предмет.Например,

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 похож на std::map, но он не хранит ключ, связанный со значением.Он хранит только тип ключа и гарантирует, что он уникален в наборе.

У вас также есть std::multiset, который следует той же схеме.(log (n)) доступ с их find / equal_range.

47 голосов
/ 22 декабря 2011

Мультикарта хранит пары (ключ, значение), где и ключ, и значение могут появляться несколько раз.

map<key, set<value>> будет хранить каждое значение только один раз для определенного ключа. Чтобы сделать это, он должен будет сравнивать значения, а не только ключи.

Это зависит от вашего приложения, равны ли значения, сравниваемые равными, или вы все равно хотите хранить их отдельно. Возможно, они содержат поля, которые отличаются, но не участвуют в сравнении для набора.

13 голосов
/ 22 декабря 2011
map::insert

Поскольку контейнеры map не допускают дублирования значений ключа, операция вставки проверяет для каждого вставленного элемента, существует ли уже другой элемент в контейнере с таким же значением ключа, если так, элемент не вставлен и егосопоставленное значение никак не изменяется.

с другой стороны

multimap::insert 

может вставлять любое количество элементов с одинаковым ключом.

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

10 голосов
/ 22 декабря 2011

Последний требует, чтобы значения можно было упорядочить (либо через operator<, либо через функцию сравнения), а первый - нет.

...