Scott Meyers的有效STL(第195页)中有以下一行:
“必须测试lower_bound的结果以查看它是否指向您正在寻找的值。与find不同,您不能仅针对结束迭代器测试lower_bound的返回值。”
任何人都可以解释为什么你不能这样做?似乎对我来说很好。
答案 0 :(得分:9)
它适用于您,因为您的元素存在。
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
会不一致。实际上,此算法返回的迭代器可以用作后续插入操作的提示。