Satu-satunya cara yang saya temukan untuk memeriksa duplikat adalah dengan memasukkan dan memeriksa std::pair.second
untuk false
, tetapi masalahnya adalah ini masih menyisipkan sesuatu jika kunci tidak digunakan, sedangkan yang saya inginkan adalah map.contains(key);
fungsi.
148
Jawaban:
Gunakan
my_map.count( key )
; hanya dapat mengembalikan 0 atau 1, yang pada dasarnya adalah hasil Boolean yang Anda inginkan.Bergantian
my_map.find( key ) != my_map.end()
juga bekerja.sumber
map::count
diimplementasikan sebagaifind(__x) == end() ? 0 : 1;
. Untukmultimap
Anda mungkin memiliki argumen kinerja, tapi itu bukan pertanyaan OP dan saya masih lebih suka keanggunan.has(k)
/contains(k)
seperti setiap kelas peta waras lainnya di planet ini. Desain antarmuka buruk. Pendekatan find () terlalu bertele-tele dancount(k)
pendekatannya jelas tidak setara dengan semantikhas(k)
. Dalam hal ini tidak adafind(k)
. Lihat jumlah tampilan pada pertanyaan ini.Jawaban Potatoswatter baik-baik saja, tetapi saya lebih suka menggunakan
find
ataulower_bound
sebagai gantinya.lower_bound
ini sangat berguna karena iterator yang dikembalikan selanjutnya dapat digunakan untuk penyisipan yang diisyaratkan, jika Anda ingin memasukkan sesuatu dengan kunci yang sama.sumber
value
dapat dilewati jika penyisipan tidak perlu.lower_bound
solusi berbasiskan adalah berlebihan. Saya agak hanya menyebutkan jawaban saya "untuk kelengkapan"; seperti yang saya katakan, milik Anda sangat memadai. :-)insert
apriori. Sebenarnya, ada perbedaan lain jika menggunakan amultimap
,lower_bound
metode menyisipkan di awal rentang yang setara sedangkaninsert
metode polos menambah akhir rentang.Desideratum Anda,,
map.contains(key)
dijadwalkan untuk konsep standar C ++ 2a . Pada 2017 diterapkan oleh gcc 9.2 . Itu juga dalam dentang saat ini .sumber