[英]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, 7
, lower_bound(..., 5)
將返回指向6的迭代器。
因此,有兩種檢查值是否存在的方法:
使用equal_range
也可以獲得upper_bound
(單獨計算lower_bound
和upper_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.