我在这些页面上查看了upper_bound和lower_bound算法在stl中的工作方式:lower_bound,upper_bound,在这些页面上以相同的方式记录:lower_bound、upper_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进行比较是双重否定的,因此它们做的是完全相同的事情?
是否真的有区别,我只是没有看到,这是一个错误的文件在网站上?如果是后者,正确的方法是什么?
6条答案
按热度按时间5sxhfpxr1#
其中
l
表示b
的下限,u
表示b
的上限。因此,如果有一个范围的值对于所使用的比较是“相等的”,
lower_bound
给你第一个,upper_bound
给你一个过去的结束。这是STL范围[first, last)
的正常模式。fhity93d2#
一个简单的答案是和少混乱的方式来记住这是下面
std::lower_bound
-返回给定范围内第一个元素的迭代器,该元素为EQUAL_TO or Greater than
瓦尔。std::upper_bound
-返回给定范围内第一个元素Greater than val
的迭代器。vlurs2pr3#
lower_bound
:返回一个迭代器,指向范围[first,last)中的第一个元素,其不小于瓦尔。
upper_bound
:返回一个迭代器,它指向范围[first,last)中的第一个元素,该元素比瓦尔大。
现在有一个区别是 * 不小于 * 的东西和 * 大于 * 的东西。
例如,如果比较
4
和5
,可以说但是,如果你比较
4
和4
:vc9ivgsu4#
来自vscode的简单答案
lower_bound:查找可以插入瓦尔而不更改顺序的第一个位置
上界:查找可以插入瓦尔而不更改顺序的最后位置
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)中的所有值
结果
它表明所有v在集合s中满足1 < v <= 11a.k.a所有v在**[1,11)**
删除[A,B]中的所有值
结果
它显示所有v在集合s中satsify1 <= v <= 11a.k.a所有v在**[1,11]**
删除(A,B)中的所有值
结果
它显示所有v在集合s中满足1 < v < 11a.k.a所有v在**(1,11)**
迭代(A,B)中的所有值
结果
它表明所有v在集合s中满足1 < v <= 11a.k.a所有v在**(1,11]**
dphi5xsq6#
想想有序字符串中的插入点。
要么在所有其他2之前插入2,要么在所有其他2之后插入2。
例如