Saya menemukan bahwa mereka memiliki satu kunci dan beberapa nilai yang unik.
Jawaban:
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 sedangkan std::map<key, whatever>
membutuhkan keunikan key
.
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 a std::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 sebuah std::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.
std::pair<auto first, auto second> range = myMap.equal_range("test");
ini tidak berfungsi, karena error: 'auto' not allowed in template argument
. Gunakan const 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/
Yang terakhir mensyaratkan bahwa nilai-nilai dapat diurutkan (baik melalui operator<
atau fungsi pembanding), yang pertama tidak.
T
yang tidak ada pemesanan. Anda dapat menggunakannya untuk membuat file std::multimap<U, T>
, tetapi Anda tidak dapat menggunakannya untuk membuat file std::map<U, std::set<T> >
.