2012-01-05 92 views
8

在有效的STL斯科特邁爾斯(195頁)有以下行:測試LOWER_BOUND的返回值迭代器

「LOWER_BOUND的結果必須進行測試,看它是否指向你的價值與find不同,你不能僅僅針對end迭代器測試lower_bound的返回值。「

任何人都可以解釋爲什麼你不能這樣做?似乎爲我工作得很好。

+0

這本書在當時的背景是什麼?不知道這本書是在說什麼,這是令人困惑的。是否使用'lower_bound'來查看集合中是否包含值? – Justin 2018-01-22 06:33:49

回答

9

它適合你,因爲你的元素是存在的。

lower_bound返回一個迭代到第一元件不少於大於給定值,並upper_bound返回一個迭代到第一元件大於給定值時

鑑於陣列1, 2, 3, 3, 4, 6, 7lower_bound(..., 5)將返回指向6.

因此,檢查所述值是否存在的兩種方式的迭代器:

  • 使用equal_range也得到了upper_bound(計算單獨lower_boundupper_bound可能會不理想)。如果邊界之間的std::distance大於0,則表示元素存在。

    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 
    
  • 通過比較符合您的價值迭代器指向的元素(爲運營商提供!=<是一致的),但你必須確保它不會返回結束迭代。

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

此外,由於lower_bound是一個二進制搜索算法如果沒有找到該元素,這將是不一致的返回end。實際上,這個算法返回的迭代器可以用作後續插入操作的提示。

+0

+1:但正如邁爾斯在該書中所說,比較平等不會總是有效(因爲'lower_bound'使用'<',而不是'==')。 – 2012-01-05 10:43:21

+0

@Oli Charlesworth:如果你重寫'<',你應該重寫'=='。改編的答案。 – Benoit 2012-01-05 10:44:59

+2

即使你這樣做,他們也不一定對應:'=='對應於「平等」,'<'對應於「等同」。有關這方面的討論,請參閱有效STL的第19項。 – 2012-01-05 10:48:18