我在这些页面上查看了upper_bound和lower_bound算法在stl中的工作原理:lower_bound,upper_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进行比较是双重否定,因此它们完全相同?
实际上是否存在差异,我只是没有看到,这是网站文档中的错误吗?如果是后者,那么正确的方法是什么?
答案 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。
现在不小于的东西和大于的东西之间存在差异。
例如,如果您比较4
和5
,则可以说
5 is _not less than_ 4
5 is _greater than_ 4
但是,如果您比较4
和4
:
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