为什么std :: set :: lower_bound(x)(有效地)定义为最小数字> = x而不是最大数字< = x?

时间:2012-06-27 15:34:36

标签: c++ stl set

也许我误解了lower bound的技术定义,但我希望如果我有一组a = { 0, 3, 4 }并计算a.lower_bound(2)结果将是0。即我希望std::set::lower_bound接近infimum

的数学概念

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

这背后的原因是什么?

2 个答案:

答案 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_boundupper_bound的行为放在一起可能会有所帮助。

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

lower_boundupper_bound的定义使得他们找到比较指定值的元素的范围。如果您在lower_bound(x)upper_bound(x)之间进行迭代,则会迭代所有比较等于x的元素。如果没有元素等于x,则保证lower_bound(x) == upper_bound(x)

此功能对std::map不太重要,std::lower_bound每个键最多只有一个元素,但对于非唯一关联容器和可能使用的非成员equal_range非常有用。任意排序元素序列。

[请注意,如果你想获得两者的下限和上限,你应该调用{{1}},而不是两者。]