- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我了解到 C++
中 map
的底层数据结构是一个自平衡的二叉搜索树。由于在这些数据结构中,查找键的下限和上限有很多用处,您会认为 map lower_bound 和 upper_bound 函数将为您提供这种能力。令人遗憾的是,这些功能无法实现。有谁知道为什么 lower_bound 的行为方式是这样的? (它为您提供了不在给定 key 之前的 key )。
最佳答案
自从 SGI 甚至引入 STL 之前我就一直在使用 C++,并且出于某种原因仍然设法搞砸了使用这些方法,甚至在将它们呈现给类时让自己感到尴尬。我认为我的问题是:
这些名字在数学上已经具有直观但不同的含义。鉴于数学含义,在大集合或 map 中似乎很奇怪,upper_bound
和 lower_bound
实际上是相同或相邻的元素。
名称“upper_bound”和“lower_bound”听起来好像两者之间存在某种对称性,但实际上并非如此。如果名称类似于 least_ge
,我会轻松得多(至少大于或等于)lower_bound 和 least_gt
(最小大于)upper_bound。
如果有人有助记符或逻辑可以使这些易于内化,请分享。否则,感觉就像他们写了两个有用的函数,但使用了两个随机的数学术语来命名这些函数,无法从名称中推导出语义。到那时,为什么不使用像egptr
这样的虚构名称呢?和 pbase
?我的意思是至少我没有任何预先存在的直觉来克服关于 streambuf
的名字。方法...
无论如何,我认为这是您必须记住的基本规则:
lower_bound(X)
返回最低元素 v
这样 v >= X
upper_bound(X)
返回最低元素 v
这样 v > X
要遍历半开区间 [L,H),从 lower_bound(L)
开始并停止(不处理)lower_bound(H)
. 这通常是您想要的,因为在 C++ 中遍历半开区间是最常见的——例如,[ buf
, buf+nbytes
), 或 [ 0
, array_size
), 或 [ begin()
, end()
).
要遍历闭区间 [L,H],从 lower_bound(L)
开始并停在 upper_bound(H)
.
要遍历开区间 (L,H),从 upper_bound(L)
开始并停在 lower_bound(H)
.
在非空容器中,lower_bound(X)
的镜像是std::prev(upper_bound(X))
和upper_bound(X)
的镜像是std::prev(lower_bound(X))
.当然,如果一个元素等于begin()
, 那么你不能用 std::prev
向后退一步,所以你需要额外的逻辑来处理这个点不能用迭代器值表示的事实。
在多重集/多重映射中,第一个 v
是lower_bound(v)
如果该元素确实是 v
.最后v
是std::prev(upper_bound(v))
如果容器不为空且该元素为 v
,但记得在尝试之前检查容器是否为空 prev
在 end()
.
关于C++ 映射 lower_bound/upper_bound,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61193289/
似乎在 C++20 中使用与 std::lower_bound() 正常工作的相同比较仿函数不适用于 std::ranges::lower_bound() 。以下代码无法使用 Visual Studi
C++ 草案对 std::lower_bound 说: § 25.4.3.1 lower_bound [lower.bound] template ForwardIterator lower_bo
最近,在处理 C++ 编程问题时,我遇到了一些有趣的事情。我的算法使用了一个非常大的集合,并且会在其上多次使用 std::lower_bound 。然而,在提交我的解决方案之后,与我在纸上所做的数学运
在尝试自学 STL 时,我编写了以下类: class Person{ public: ... bool operator::iterator itr = lower_bound(v.b
我尝试在 C++ STL Map 中使用 lowerbound()。在我使用它之前,我通过如下程序测试它的功能: int main () { std::map mymap; std::map:
我在使用 STL lower_bound 函数时遇到一些问题。我是 C++ 的新手。我需要对 Biz 类对象的 vector 进行排序,所以我使用了这种排序: bool cmpID(const Biz
#include using namespace std; int main() { int t; cin >> t; for (int i = 0; i > n >> m; long in
我正在尝试添加 Node (struct)放入一个数组(类)中并使用 lower_bound 对其进行排序.在调试我的代码时,我意识到它停止工作: auto itr = std::lower_boun
当我解决392.Is Subsequence的问题时.在 Leetcode 上。 当我使用 lower_bound() 函数时,我无法理解我想找到最后一个元素和找不到然后返回最后一个元素之间的区别。
我有一个二维数组,我想在其中找到特定列的下界。 我如何使用 std::lower_bound 做到这一点? 最佳答案 简介 这并不像人们想象的那么难,让我们首先浏览一下适用于范围的算法函数的摘要。 每
我给了一个std::set>和一个整数 x ,我必须找到第一个元素大于或等于给定整数 x 的第一对的迭代器. 我了解到如果s是 set>和 {x, y}是一对然后我可以使用 s.lower_bound
在这里,我使用 std::lower_bound() 创建了一个二进制搜索函数。如下图。如果我传递 std::pair,这会很好地工作,但是我只想对 pair 的第一个值执行二进制搜索。我认为在 lo
我了解到 C++ 中 map 的底层数据结构是一个自平衡的二叉搜索树。由于在这些数据结构中,查找键的下限和上限有很多用处,您会认为 map lower_bound 和 upper_bound 函数将为
假设我有一个vector,其元素是int类型。如何优雅地使用std::lower_bound()查找最接近目标值的元素? 我写了如下代码: #include #include #include
从互联网上阅读,我了解到 C++ 中的 lower_bound() 方法用于返回一个指向范围 [first, last) 中的第一个元素的迭代器,该元素的值不是小于值。这意味着该函数返回刚好大于该数字
我了解到 C++ 中 map 的底层数据结构是一个自平衡的二叉搜索树。由于在这些数据结构中,查找键的下限和上限有很多用处,您会认为 map lower_bound 和 upper_bound 函数将为
我的编译器拒绝编译这个简单的代码: struct mystruct{ int x; bool operator test; auto it = std::lower_bound(tes
我想在 C++ 中的 std::set 中找到严格小于给定元素的最大元素。一些问题建议找到 lower_bound 迭代器并将其递减,即 set st; // Add elements int x;
我有一个带有成员变量 __emails 的类 PersonsDB,它应该是指向类 Person 对象的指针的排序 vector (按 Person 电子邮件排序)。我的计划是将 lower_bound
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我是一名优秀的程序员,十分优秀!