#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的元素迭代器