Std :: multimap <key, value> ve std :: map <key, std :: set <value>> arasındaki fark nedir


Yanıtlar:


52

Çoklu harita, hem anahtarın hem de değerin birkaç kez görünebileceği (anahtar, değer) çiftlerini depolar.

map<key, set<value>>Yalnızca belirli bir anahtar için bir kez her değeri depolar. Bunu yapmak için, sadece anahtarları değil değerleri karşılaştırması gerekecek.

Eşitleri karşılaştıran değerlerin eşdeğer olup olmadığı veya bunları yine de ayrı olarak saklamak isteyip istemediğiniz uygulamanıza bağlıdır. Belki de farklı olan ancak kümenin karşılaştırmasında yer almayan alanlar içeriyorlar.


5
Bu nedenle, bir std :: multimap <key, value> bir std :: map <key, std :: multiset <value>> gibidir, aralarındaki fark, sonraki değerlerin sıralanmasıdır. Bu doğru mu?
大 宝剑

2
Hayır, std::multimap<key, value>aynı anahtarın birden çok kez görünmesine izin verirken std::map<key, whatever>, benzersizliğini gerektirir key.
Yixing Liu

75

A std::map, tür değerinizle ilişkilendirilmiş benzersiz bir anahtara sahip olmanızı sağlayan ilişkilendirilebilir bir kapsayıcıdır. Örneğin,

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, a'ya eşittir std::map, ancak anahtarlarınız artık benzersiz değildir. Bu nedenle, tek bir benzersiz öğe bulmak yerine bir dizi öğe bulabilirsiniz. Örneğin,

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

The std::set, bir gibidir std::map, ancak bir değerle ilişkilendirilmiş bir anahtarı saklamaz. Yalnızca anahtar türünü depolar ve set içinde benzersiz olduğunu garanti eder.

Ayrıca std::multiset, aynı düzeni izleyen şeylere de sahipsiniz .

Tüm bu kapsayıcılar, bulma / eşit_aralıkları ile bir O (log (n)) erişimi sağlar.


6
Çoklu harita işlevinde bu satır std::pair<auto first, auto second> range = myMap.equal_range("test");çalışmıyor çünkü error: 'auto' not allowed in template argument. const auto range = myMap.equal_range("test")Bunun yerine kullanın .
vancexu

2
harita türü? 4. satırdaki MapType olması gerekmez mi?
lolololol

İlk kimin olduğundan emin değilim, ancak biri diğerinin kopyası gibi: cppbuzz.com/What-is-difference-between-map-and-multimap
büyük_prime_is_463035818

1
ahah, cppbuzz StackOverflow ya da ne ?, bu cevabı yıllar önce hala c ++ 'da günlük kodlama yaparken yazdım. Ve gerçekten bir yazım hatası satırı 4 var, teşekkürler @lolololol
typedef

1
(ve kopyalama / yapıştırma başarısız oldu, std :: map bildirimi: std :: map <std :: string, int> şablonundaki türleri bile göstermiyorlar)
typedef

13
map::insert

Çünkü mapkaplar yinelenen anahtar değerleri izin vermez, her bir eleman için yerleştirme işlemi kontrol eder, böylece eleman takılı değildir ve eşlenen değer hiçbir şekilde değiştirilmez başka bir eleman, aynı anahtarı ile kap içinde zaten var olup olmadığını sokulur.

diğer yandan

multimap::insert 

aynı anahtarla herhangi bir sayıda öğe ekleyebilir.

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


Hem fark hem de dahili olarak nasıl çalıştığı konusunda iyi bağlantı. bağlantı
Rndp13

10

İkincisi, değerlerin sıralanmasını gerektirir (ya operator<bir karşılaştırma işlevi aracılığıyla ya da bir karşılaştırma işlevi), birincisi değil.


Görünüşe göre operatör <harita veya çoklu harita üzerinde aynı şekilde çalışıyor mu? en.cppreference.com/w/cpp/container/map/operator_cmp
johnbakers

Evet, ancak cevabım değerlerin sıralanmasına atıfta bulundu. TSıralama içermeyen bir türünüz olduğunu varsayalım . Bunu bir oluşturmak için kullanabilirsiniz std::multimap<U, T>, ancak bir std::map<U, std::set<T> >.
Björn Pollex
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.