测试lower_bound对结束迭代器的返回值

时间:2012-01-05 10:38:08

标签: c++ stl map iterator lower-bound

Scott Meyers的有效STL(第195页)中有以下一行:

“必须测试lower_bound的结果以查看它是否指向您正在寻找的值。与find不同,您不能仅针对结束迭代器测试lower_bound的返回值。”

任何人都可以解释为什么你不能这样做?似乎对我来说很好。

1 个答案:

答案 0 :(得分: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会不一致。实际上,此算法返回的迭代器可以用作后续插入操作的提示。