Saya menemukan bahwa mereka memiliki satu kunci dan beberapa nilai yang unik.
87
Multimap menyimpan pasangan (kunci, nilai) di mana kunci dan nilai dapat muncul beberapa kali.
Hanya map<key, set<value>>
akan menyimpan setiap nilai satu kali untuk kunci tertentu. Untuk melakukan itu, ia harus dapat membandingkan nilainya, bukan hanya kuncinya.
Itu bergantung pada aplikasi Anda jika nilai yang dibandingkan sama setara, atau jika Anda tetap ingin menyimpannya secara terpisah. Mungkin mereka berisi bidang yang berbeda tetapi tidak mengambil bagian dalam perbandingan untuk himpunan.
std::multimap<key, value>
memungkinkan kunci yang sama muncul beberapa kali sedangkanstd::map<key, whatever>
membutuhkan keunikankey
.A
std::map
adalah wadah asosiatif, yang memungkinkan Anda memiliki kunci unik yang terkait dengan nilai jenis Anda. Sebagai contoh,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
sama dengan astd::map
, tetapi kunci Anda tidak unik lagi. Oleh karena itu, Anda dapat menemukan berbagai item daripada hanya menemukan satu item unik. Sebagai contoh,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; }
Ini
std::set
seperti sebuahstd::map
, tetapi tidak menyimpan kunci yang terkait dengan suatu nilai. Ini hanya menyimpan jenis kunci, dan meyakinkan Anda bahwa itu unik dalam set.Anda juga memiliki
std::multiset
, yang mengikuti pola yang sama.Semua kontainer ini menyediakan akses O (log (n)) dengan find / equal_range-nya.
sumber
std::pair<auto first, auto second> range = myMap.equal_range("test");
ini tidak berfungsi, karenaerror: 'auto' not allowed in template argument
. Gunakanconst auto range = myMap.equal_range("test")
sebagai gantinya.map::insert
Karena
map
penampung tidak mengizinkan nilai kunci duplikat, operasi penyisipan memeriksa setiap elemen yang dimasukkan apakah elemen lain sudah ada dalam penampung dengan nilai kunci yang sama, jika demikian, elemen tersebut tidak disisipkan dan nilai yang dipetakan tidak diubah dengan cara apa pun.di samping itu
multimap::insert
dapat memasukkan sejumlah item dengan kunci yang sama.
http://www.cplusplus.com/reference/stl/map/
http://www.cplusplus.com/reference/stl/multimap/
sumber
Yang terakhir mensyaratkan bahwa nilai-nilai dapat diurutkan (baik melalui
operator<
atau fungsi pembanding), yang pertama tidak.sumber
T
yang tidak ada pemesanan. Anda dapat menggunakannya untuk membuat filestd::multimap<U, T>
, tetapi Anda tidak dapat menggunakannya untuk membuat filestd::map<U, std::set<T> >
.