也许我误解了lower bound
的技术定义,但我希望如果我有一组a = { 0, 3, 4 }
并计算a.lower_bound(2)
结果将是0
。即我希望std::set::lower_bound
接近infimum
然而标准库将其定义为不小于(有效>=
)x的最大数字。
这背后的原因是什么?
答案 0 :(得分:28)
“[lower|upper]_bound
”函数用于返回集合中的某个位置,您可以在其中插入不违反集合顺序的键。因为STL设置的迭代器指向下一个元素之前,如果lower_bound(2)
将迭代器返回到0
,那么插入2
会违反您的集合的顺序,现在它将是{ {1}}。上限用于显示您可以在不违反设置顺序的情况下插入的最后一个位置。
如果您的设备可能包含重复的密钥条目,则此功能非常有用。考虑{2, 0, 3, 4}
。 {0, 3, 3, 4}
会向此处返回一个迭代器:lower_bound(3)
,而{0, *, 3, 3, 4}
会在此处返回:upper_bound(3)
。
答案 1 :(得分:5)
将lower_bound
和upper_bound
的行为放在一起可能会有所帮助。
在STL中,范围始终是闭合打开的间隔。由两个迭代器first
和last
分隔的范围包括first
和last
之间的所有元素,包括first
和排除last
。使用区间符号,我们将其表示为[first, last)
。
lower_bound
和upper_bound
的定义使得他们找到比较指定值的元素的范围。如果您在lower_bound(x)
和upper_bound(x)
之间进行迭代,则会迭代所有比较等于x
的元素。如果没有元素等于x
,则保证lower_bound(x) == upper_bound(x)
。
此功能对std::map
不太重要,std::lower_bound
每个键最多只有一个元素,但对于非唯一关联容器和可能使用的非成员equal_range
非常有用。任意排序元素序列。
[请注意,如果你想获得两者的下限和上限,你应该调用{{1}},而不是两者。]