upper_bound和lower_bound的区别到底是什么?

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
    vector<int> v1 = {0, 1, 5, 3, 2, 1, 4, 7, 6};
    vector<int>::iterator up;
    up = upper_bound(v1.begin(), v1.end(), 3);
    cout << *up << endl;

    vector<int> v2 = {0, 1, 5, 3, 2, 1, 4, 7, 6};
    vector<int>::iterator lo;
    lo = lower_bound(v2.begin(), v2.end(), 3);
    cout << *lo << endl;

    return 0;
}

为什么上面的代码输出的结果是:

4

4

这不没有区别吗?

C++Primer上写到:

lower_bound返回一个迭代器,表示第一个小于等于val的元素

upper_bound返回一个迭代器,表示第一个大于val的元素

可是上面代码输出的结果完全不是这回事啊???

lower_bound( )和upper_bound( )有个前提条件,就是数组必须是有序的

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
    vector<int> v1 = {1,2,3,4,5,6,7,8};
    vector<int>::iterator up;
    up = upper_bound(v1.begin(), v1.end(), 3);
    cout << *up << endl;

    vector<int> v2 = {1,2,3,4,5,6,7,8};
    vector<int>::iterator lo;
    lo = lower_bound(v2.begin(), v2.end(), 3);
    cout << *lo << endl;

    return 0;
}

当有序的时候,就输出不同了

升序和降序的用法是不同的,在非正升序数组中lower_bound 和upper_bound使用二分搜索算法必须使用lower_bound(v.begin(), v.end(), 3,cmp)的方式来实现,其中cmp是你自己需要实现的排列函数,因为lower_bound 和upper_bound的源码里默认是按照升序来处理的。所以最简单的方式还是按照升序排列好再使用。

set.lower_bound(2) map.lower_bound()
返回第一个大于等于2的元素迭代器

set.upper_bound(2) map.upper_bound()
返回第一个大于2的元素迭代器