stl中upper_bound和lower_bound之间的差异

Difference between upper_bound and lower_bound in stl

本文关键字:bound 之间 upper stl lower      更新时间:2023-10-16

我在这些页面上研究了上边界和下边界算法如何在stl中工作:下边界、上边界,并且在这些页面中以相同的方式进行了记录:下边界,上边界

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

下限(第10行):

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

上边界(第10行):

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

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

真的有什么不同吗,我只是没有看到,这是网站上文档中的错误吗?如果是后者,正确的方法是什么?

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的上界。

因此,如果有一系列的值与所使用的比较"相等",lower_bound会给你第一个,upper_bound会给你一个超过这些值末尾的值。这是STL范围[first, last)的正常模式。

一个简单的答案是,记住这一点的方法在下面

std::lower_bound-将迭代器返回到给定范围内的第一个元素,即EQUAL_TO or Greater than值。

std::upper_bound-将迭代器返回到给定范围内的第一个元素,即Greater than val

lower_bound:

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

upper_bound:

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

现在,不小于某事和大于某物之间存在差异。

例如,如果你比较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

vscode 的简单答案

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

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

简单的答案是[下限,上限)

s.lower_bound(t)将迭代器返回到集合中的第一个元素v使得v>=t
s.upper_bound(t)将迭代器返回到集合中的第一个元素v,使得v>t.

当我们经常为STL集或映射调用xxxxx_bound时,
我们通常希望找到某个范围内的数据。

我分享了lower_bound&这里是上边界样本。因此,每个人都可以很容易地使用和记住它

迭代[A,B)中的所有值

set<int> s = {0,1,2,10,11,12,15};
int A=1, B=11;
for(auto iter = s.lower_bound(A); iter != s.lower_bound(B); iter++) {
cout<<*iter<<"t";
}

结果

1       2       10

它显示了集合s中的所有v的satsify1<v<=11,也就是[1,11)中的所有v

迭代[A,B]中的所有值

set<int> s = {0,1,2,10,11,12,15};
int A=1, B=11;
for(auto iter = s.lower_bound(A); iter != s.upper_bound(B); iter++) {
cout<<*iter<<"t";
}

结果

1       2       10      11

它显示集合s satsify1<=中的所有vv<=11,也就是[1,11]中的所有v

迭代(A,B)中的所有值

set<int> s = {0,1,2,10,11,12,15};
int A=1, B=11;
for(auto iter = s.upper_bound(A); iter != s.lower_bound(B); iter++) {
cout<<*iter<<"t";
}

结果

2       10

它显示了集合s中的所有v的satsify1<v<11,也就是(1,11)中的所有v

迭代(A,B])中的所有值

set<int> s = {0,1,2,10,11,12,15};
int A=1, B=11;
for(auto iter = s.upper_bound(A); iter != s.upper_bound(B); iter++) {
cout<<*iter<<"t";
}

结果

2       10      11

它显示了集合s中的所有v的satsify1<v<=11,也就是(1,11]中的所有v