c++ stl中upper_bound和lower_bound的区别

zzwlnbp8  于 2023-10-20  发布在  其他
关注(0)|答案(6)|浏览(104)

我在这些页面上查看了upper_bound和lower_bound算法在stl中的工作方式:lower_boundupper_bound,在这些页面上以相同的方式记录:lower_boundupper_bound
从链接中查看代码,它们似乎对我做了完全相同的事情,只有以下几行不同(查看前两个链接中的代码):
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进行比较是双重否定的,因此它们做的是完全相同的事情?
是否真的有区别,我只是没有看到,这是一个错误的文件在网站上?如果是后者,正确的方法是什么?

5sxhfpxr

5sxhfpxr1#

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)的正常模式。

fhity93d

fhity93d2#

一个简单的答案是和少混乱的方式来记住这是下面
std::lower_bound-返回给定范围内第一个元素的迭代器,该元素为EQUAL_TO or Greater than瓦尔。
std::upper_bound-返回给定范围内第一个元素Greater than val的迭代器。

vlurs2pr

vlurs2pr3#

lower_bound
返回一个迭代器,指向范围[first,last)中的第一个元素,其不小于瓦尔
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
vc9ivgsu

vc9ivgsu4#

来自vscode的简单答案
lower_bound:查找可以插入瓦尔而不更改顺序的第一个位置
上界:查找可以插入瓦尔而不更改顺序的最后位置

dfuffjeb

dfuffjeb5#

简单的答案是**[ lower_bound,upper_bound)**

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

当我们经常为STL集合或Map调用xxxxx_bound时,
我们常常希望找到某个范围内的数据。
我在这里分享了lower_bound和upper_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";
}

结果
它表明所有v在集合s中满足1 < v <= 11a.k.a所有v在**[1,11)**

删除[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";
}

结果
它显示所有v在集合s中satsify1 <= v <= 11a.k.a所有v在**[1,11]**

删除(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

它显示所有v在集合s中满足1 < v < 11a.k.a所有v在**(1,11)**

迭代(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

它表明所有v在集合s中满足1 < v <= 11a.k.a所有v在**(1,11]**

dphi5xsq

dphi5xsq6#

想想有序字符串中的插入点。
要么在所有其他2之前插入2,要么在所有其他2之后插入2。
例如

l        u
          v        v
[1, 1, 1, 2, 2, 2, 3, 3, 3]

相关问题