Benzersiz bir anahtar ve birden çok değere sahip olduklarını buldum.
Yanıtlar:
Ç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.
std::multimap<key, value>
aynı anahtarın birden çok kez görünmesine izin verirken std::map<key, whatever>
, benzersizliğini gerektirir key
.
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.
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 .
map::insert
Çünkü map
kaplar 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/
İ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.
T
Sı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> >
.