2012-01-05 41 views
8

aşağıdaki çizgi vardır Bulmaktan farklı olarak, alt_bound'un dönüş değerini son yineleyiciye karşı test edemezsiniz. "Testi LOWER_BOUND dönüş değeri yineleyici

Bunu neden yapamayacağınızı herkes anlatabilir mi? benim için iyi çalışıyor gibi görünüyor.

+0

Kitapta bu noktada bağlam nedir? Kitabın ne hakkında konuştuğunu bilmeden kafa karıştırıcı. Sette bir değer bulunup bulunmadığını görmek için 'lower_bound' kullanıldığını mı söylüyor? – Justin

cevap

9

Sizin için iyi çalışıyor çünkü öğeniz mevcut.

lower_bound birinci eleman verilen değerden daha küçük olmayan için bir yineleme döndürür ve upper_bound birinci eleman verilen değerden daha büyük bir yineleyici döndürür.

  • kullanımı equal_range da upper_bound (bilgisayar almak için: dizi 1, 2, 3, 3, 4, 6, 7 Verilen

    , lower_bound(..., 5) Dolayısıyla 6.

    , değeri mevcut olup olmadığının kontrol edilmesi için iki yol işaret bir yineleyici döndürür Ayrı ayrı lower_bound ve upper_bound büyük olasılıkla suboptimal olacaktır). Sınırlar arasındaki std::distance, 0'dan büyükse, öğe bulunur.

    1, 2, 3, 3, 4, 6, 7 
    std::distance(std::lower_bound(v.begin(),v.end(),5), std::upper_bound(v.begin(),v.end(),5)) == 0 // 6 is absent 
    std::distance(std::lower_bound(v.begin(),v.end(),3), std::upper_bound(v.begin(),v.end(),3)) == 2 // 3 is present 
    
  • (!= ve < tutarlı olan operatörler sağlanan) sizin değeri ile yineleyici tarafından işaret elemanı karşılaştırın, ama bunu son yineleyici vermediğinden emin olmak gerekir. lower_bound beri Ayrıca

*(std::lower_bound(v.begin(), v.end(), 5)) != 5 

, eleman bulunamadığı takdirde end dönmek tutarsız olacak bir ikili arama algoritmaları olduğunu. Aslında, bu algoritma tarafından döndürülen yineleyiciler, örneğin bir sonraki ekleme işlemi için bir ipucu olarak kullanılabilir.

+0

+1: Ancak Meyers'in kitabında söylediği gibi, eşitlikle karşılaştırma, her zaman işe yaramayacaktır (çünkü 'lower_bound'' '' '' '' '' '' '' '=' '' '' '' = '' '=' '' = '' '=' '' = '' '=' '' = '' '=' '' = '' '=' '' = '' '=' '' = '' '=' '' '' '' '' '] '' kullanır. –

+0

@Oli Charlesworth: Eğer '' 'yi geçersiz kılarsanız, muhtemelen' == 'değerini de geçersiz kılmalısınız. Uyarlanmış cevap. – Benoit

+2

Yapsanız bile, bunlar birbiriyle uyuşmaz: '==' "eşitlik" e karşılık gelir, '<' eşdeğerliliğe karşılık gelir. Bunun bir tartışması için Etkin STL Madde 19'a bakınız. –