11

也许我误解了 的技术定义,lower bound但我希望如果我有一个集合a = { 0, 3, 4 }并计算出a.lower_bound(2)结果会是0. 即我希望std::set::lower_bound接近下确界的数学概念

然而标准库将其定义为不小于(有效地>=)x 的最大数。

这背后的原因是什么?

4

2 回答 2

28

" [lower|upper]_bound" 函数旨在返回集合中的一个位置,您可以在其中插入一个不会违反集合顺序的键。因为 STL 集合的迭代器指向下一个元素之前,如果lower_bound(2)将迭代器返回到0,那么插入2将违反集合的顺序,它现在是{2, 0, 3, 4}。上限用于显示您可以在不违反设置顺序的情况下插入的最后一个位置。

如果您的集合可能有重复的键条目,这将非常有用。考虑{0, 3, 3, 4}lower_bound(3)将迭代器返回到这里:{0, *, 3, 3, 4},而upper_bound(3)将它返回到这里:{0, 3, 3, *, 4}

于 2012-06-27T15:49:47.297 回答
5

lower_bound考虑和upper_bound一起的行为可能会有所帮助。

在 STL 中,范围始终是闭开区间。first由两个迭代器和分隔的范围包括和last之间的所有元素,包括和不包括。使用区间表示法,我们将其表示为.firstlastfirstlast[first, last)

lower_bound并被upper_bound定义为找到与指定值相等的元素范围。如果您在 and 之间进行迭代lower_bound(x)upper_bound(x)您将遍历所有比较等于 的元素x。如果没有元素等于x,则保证lower_bound(x) == upper_bound(x)

对于每个键最多有一个元素,这个特性不太重要std::map,但对于非唯一关联容器和std::lower_bound可用于任意排序元素序列的非成员来说,这是一个非常有用的特性。

[请注意,如果您想同时获得下限和上限,则应equal_range改为调用,它会同时返回。]

于 2012-06-27T16:44:00.793 回答