簡體   English   中英

測試lower_bound對結束迭代器的返回值

[英]Test lower_bound's return value against the end iterator

在Scott Meyers(第195頁)的有效STL中,有以下行:

“必須測試lower_bound的結果,看它是否指向你正在尋找的值。與find不同,你不能只測試lower_bound對最終迭代器的返回值。”

任何人都可以解釋為什么你不能這樣做? 似乎對我來說很好。

它適用於您,因為您的元素存在。

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會不一致。 實際上,此算法返回的迭代器可以用作后續插入操作的提示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM