stl中upper_bound和lower_bound之间的差异
Difference between upper_bound and lower_bound in stl
我在这些页面上研究了上边界和下边界算法如何在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]中的第一个元素,比较该元素大于值。
现在,不小于某事和大于某物之间存在差异。
例如,如果你比较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
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
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- 在cuda线程之间共享大量常量数据
- 在c代码之间共享数据的最佳方式
- Mix_Init和Mix_OpenAudio SDL之间的区别是什么
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 大小相等但成员数量不同的结构之间的性能差异
- 类与私有变量的其他类之间的线程安全性
- 如何在cpp文件之间切换窗口?在Qt中
- 线程之间的布尔停止信号
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在 const 函数中通过引用和指针返回之间的区别
- 我想知道长双倍和双倍之间的区别
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 使用.find函数在c++中查找字符和另一个字符之间的大小
- 构造函数和转换运算符之间的重载解析
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数