Çoğaltmaları kontrol etmeyi bulmamın tek yolu, false
için std::pair.second
eklenmesi ve denetlenmesidir, ancak sorun, anahtar kullanılmadığında hala bir şey ekler, ancak istediğim, map.contains(key);
işlevidir.std :: map ekleme yapmadan bir anahtar içeriyorsa nasıl kontrol edilir?
cevap
Kullanım my_map.count(key)
; Sadece 0 veya 1 döndürülebilir, ki bu aslında istediğiniz Boolean sonucudur.
Alternatif olarak my_map.find(key) != my_map.end()
da çalışır.
-1: 'find' kullanılmalıdır. Haritalar ve multimaps için en az "count" kadar etkilidir ve bulunan anahtarlarda değişiklik yapmak için tipik gereksinimi düşündüğünüzde daha etkilidir. –
@John: Bu, zamansal optimizasyona hazır. GCC'de (ve eminim ki çoğu makul sistem), 'map :: count', 'find (__ x) == end()? 0: 1; 'Multimap' için bir performans argümanınız olabilir, fakat bu OP'nin sorusu değil ve hala zarafeti tercih ediyorum. – Potatoswatter
Hayır, erken optimizasyon argümanı, sadece optimizasyon biraz çaba harcarsa bu durumda geçerli değildir. – markh44
Potatoswatter'ın cevabı iyi, fakat bunun yerine find
veya lower_bound
kullanmayı tercih ediyorum. lower_bound
özellikle yararlıdır çünkü aynı tuşa sahip bir şey eklemek isterseniz iteratörün daha sonra iadeli bir ekleme için kullanılabilir.
map<K, V>::iterator iter(my_map.lower_bound(key));
if (iter == my_map.end() || key < iter->first) { // not found
// ...
my_map.insert(iter, make_pair(key, value)); // hinted insertion
} else {
// ... use iter->second here
}
ait
Bu, nasıl bunu yaptıklarını söylüyor… tek fark, eğer ekleme gerekli değilse “değer” in hesaplanması atlanabilir. – Potatoswatter
Elbette, OP'nin takmayı önemsemediğini anlıyorum, bu yüzden 'lower_bound' tabanlı bir çözüm çok fazla. Biraz önce cevabımdan "tamlık için" bahsetmiştim; Söylediğim gibi, seninki mükemmel. :-) –
Evet, bu iyi bir cevap ve ben hiçbir şeye katılmıyorum. Sadece 'insert' a priori alternatifi ile ilişkiyi işaret ediyor. Aslında, bir "multimap" kullanıldığında başka bir fark vardır, "lower_bound" yöntemi eşdeğer aralığın başına eklenirken, düz 'insert' yöntemi aralığın sonuna eklenir. – Potatoswatter
- 1. Sözlük, belirli bir anahtar içeriyorsa nasıl test edilir?
- 2. std :: map
- 3. NSString anahtar olarak nasıl kullanılır Objective-C++ std :: map
- 4. Bir dize yalnızca rakam/sayısal karakterler içeriyorsa nasıl kontrol edilir
- 5. std :: map başlatıcısı liste yapıcısı
- 6. std :: map öğelerinin std :: vektörünü nasıl başlatabilirim?
- 7. Ffmpeg anahtar-çerçeve oluşturma nasıl kontrol edilir?
- 8. Std :: map neden eklemek istemiyor? [C++]
- 9. Anahtar türü için atama operatörü gereksinimi std :: map
- 10. std :: map içindeki anahtar/değer türleri için gereksinimleri kopyala/taşı
- 11. std :: map genişletilmiş başlatıcı listesi nasıl olurdu?
- 12. std :: map değeri gdb'de nasıl yazdırılır
- 13. std :: map karşılaştırıcısını atar mı?
- 14. JavaScript: sayfa belirli bir div içeriyorsa kontrol
- 15. char * bir anahtar olarak std :: map'de nasıl kullanılır
- 16. Bir Linux dizini yalnızca bir alt dizin içeriyorsa ve başka bir dosya yoksa nasıl test edilir?
- 17. Anahtar değiştiriciye basıldığında nasıl kontrol edilir (shift, ctrl, alt)?
- 18. Konteynerin sabit olup olmadığını nasıl kontrol edilir
- 19. Enum bir desenle eşleşmiyorsa nasıl kontrol edilir?
- 20. Std :: map ile kullanılacak özel bir ayırıcı nasıl uygulanır?
- 21. Anahtar benzersizliği hakkında std :: unordered_multimap
- 22. Derleyici, şablon parametrelerini (map std :: vector -> std :: vector)
- 23. nasıl heterojen bir destek oluşturursunuz :: map?
- 24. Kopyala std :: map for std :: set in C++
- 25. Gerekli bir yabancı anahtar ekleme
- 26. Bilgisayara bağlama yapmadan bilgisayarı kontrol et
- 27. std :: map default constructor açık mı?
- 28. Akışta bir Tarih nesnesi nasıl kontrol edilir?
- 29. .NET: Windows bir pencereye nasıl kontrol edilir
- 30. iOS'ta bozuk bir PDF nasıl kontrol edilir?
olası yinelenen (http://stackoverflow.com/questions/1939953/how-to-find-if-a-given [belirli bir anahtar, bir C++ std :: map var olup olmadığını bulmak için nasıl] -key-exists-in-ac-stdmap) – OrangeDog