2010-10-07 23 views
107

Ç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?

+3

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

cevap

231

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.

+5

-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. –

+29

@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

+24

Hayır, erken optimizasyon argümanı, sadece optimizasyon biraz çaba harcarsa bu durumda geçerli değildir. – markh44

39

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
+0

Bu, nasıl bunu yaptıklarını söylüyor… tek fark, eğer ekleme gerekli değilse “değer” in hesaplanması atlanabilir. – Potatoswatter

+0

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. :-) –

+3

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

İlgili konular