stl中upper_bound和lower_bound之间的区别

时间:2017-01-31 13:15:09

标签: c++ stl

我在这些页面上查看了upper_bound和lower_bound算法在stl中的工作原理:lower_boundupper_bound,并且在这些页面上以相同的方式记录:lower_bound,{{ 3}}

查看链接中的代码,它们似乎对我做了完全相同的事情,只有以下几行不同(查看前两个链接中的代码):

lower_bound(第10行):

if (*it<val) {                 // or: if (comp(*it,val)), for version (2)

upper_bound(第10行):

 if (!(val<*it))                // or: if (!comp(val,*it)), for version (2) 

但肯定会颠倒比较的元素,然后将它们与false进行比较是双重否定,因此它们完全相同?

实际上是否存在差异,我只是没有看到,这是网站文档中的错误吗?如果是后者,那么正确的方法是什么?

4 个答案:

答案 0 :(得分:12)

value a a a b b b c c c
index 0 1 2 3 4 5 6 7 8
bound       l     u

l代表b的下限,而u代表b的上限。

因此,如果有一系列值等于&#34;等于&#34;关于正在使用的比较,lower_bound为您提供了第一个,upper_bound为您提供了这些比较结果。这是STL范围[first, last)的正常模式。

答案 1 :(得分:4)

lower_bound

  

返回指向范围[first,last]中第一个元素的迭代器,不比val

upper_bound

  

返回指向范围[first,last]中第一个元素的迭代器,比较大于val。

现在不小于的东西和大于的东西之间存在差异。

例如,如果您比较45,则可以说

5 is _not less than_ 4
5 is _greater than_  4

但是,如果您比较44

4 is _not less than_    4
4 is _not greater than_ 4

答案 2 :(得分:3)

一个简单的答案是,记住以下内容的方式较少混乱

713478343994900590-将迭代器返回给定范围std::lower_bound val中的第一个元素。

EQUAL_TO or Greater than-将迭代器返回给定范围std::upper_bound中的第一个元素。

答案 3 :(得分:0)

来自 vscode 的简单回答

lower_bound:找到第一个可以插入 val 而不改变顺序的位置

upper_bound:找到最后一个位置,可以在不改变顺序的情况下插入 val