上下限不符合我的预期,无法理解为什么

时间:2018-08-21 18:13:02

标签: c++ lower-bound upperbound

这是代码。结果,我得到“ 4 4”。不明白为什么它不是“ 2 4”(根据上下限的定义)。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    vector<int> v = {1, 2, 4, 5};
    vector<int>::iterator s , f;
    s = lower_bound(v.begin(), v.end(), 3);
    f = upper_bound(v.begin(), v.end(), 3);
    cout << (*s) << " " << (*f);
    return 0;
}

3 个答案:

答案 0 :(得分:5)

来自std::lower_bound

  

返回指向范围内第一个元素的迭代器    [first,last)的总和不小于 val

不小于3的第一个元素(从向量的开头)为4,因此lower_bound返回4

来自std::upper_bound

  

返回指向范围 [first,last)中第一个元素的迭代器,该元素的比较值大于 val

(从向量的开头开始)大于3的第一个元素是4,因此upper_bound返回4

造成这种混乱的原因是因为upper_bound返回的第一个元素大于给定值,因此,对称起见,我们期望lower_bound返回最后一个元素(从向量的开头)小于给定值。但是,a std函数并没有遵循这种“预期的”对称性。

答案 1 :(得分:4)

在知道std::equal_range()返回一对迭代器的情况下,更容易理解/记住std::lower_bound()std::upper_bound()返回的内容,其中第一个等于std::lower_bound()返回,第二个等于std::upper_bound()返回的值。

因此,在不同情况下,使用参数4进行调用:

1 2 3 4 4 4 4 5 E
      |       |
      F       S    - first points to the first element, second to the one behind last, representing range which contains 4

1 2 3 4 5 E
      | |
      F S  same for one element

1 2 3 4 E
      | |
      F S  same as before, but 4 is the last element

1 2 3 5 E
      |
      F==S  first == second, which means range for elements equal to 4 is empty

1 2 3 E
      |
      F==S same as before but there is no element greater than 4

E表示container.end()返回的内容-在最后一个元素后面的迭代器。

答案 2 :(得分:2)

不幸的是,lower_boundupper_bound的命名会引起混淆。这些名称是指在一个序列中搜索的结果,该序列包含多个元素,这些元素与您要搜索的元素完全相同; lower_bound将迭代器返回到起点,upper_bound返回结束点之后的一个。

当元素不是序列的一部分时,它们将迭代器返回到第一个大于您要搜索的元素的元素。如果没有更多迭代器,则可能是end迭代器。