upper_bound, lower_bound
这两个函数类似,以upper_bound为例,该函数有两种形式:
template <class ForwardIterator, class T>
ForwardIterator upper_bound (ForwardIterator first, ForwardIterator last, const T& val)
template <class ForwardIterator, class T, class Compare>
ForwardIterator upper_bound (ForwardIterator first, ForwardIterator last,
const T& val, Compare comp);
函数接受两个迭代器 first, last,一个值 val。函数所做的工作如下:以 val 作为上界,在first, last 中寻找一个区间,这个区间的上界就是 val, 显然,这样的区间有很多个,我们要选一个最贴近上界的区间。返回的迭代器就指向这个区间的右边的第一个值。
所谓的大于,小于可以自己定义。lower_bound() 返回以 val 为下界的区间的左端点的迭代器。
- upper_bound 示例:
int main() {
int input[] = {1,2,2,3,4,4,5,6,7,8,10,45};
vector<int> v(input, input+12);
vector<int>::iterator it1 , it2;
// points to eight element in v, index from 0 to 11, *it1 = 7
it1 = upper_bound(v.begin(), v.end(), 6);
cout << it1 - v.begin() << endl;
// points to six element in v, *it2 = 5
it2 = upper_bound(v.begin(), v.end(), 4);
cout << it2 - v.begin() << endl;
return 0;
}
- lower_bound示例:
int main() {
int input[] = {1,2,2,3,4,4,5,6,7,8,10,45};
vector<int> v(input, input+12);
vector<int>::iterator it1 , it2;
// points to eight element in v, *it1 = 4
it1 = lower_bound(v.begin(), v.end(), 4);
cout << *it1 << endl;
cout << it1 - v.begin() << endl;
// points to six element in v, *it2 = 10
it2 = lower_bound(v.begin(), v.end(), 10);
cout << *it2 << endl;
cout << it2 - v.begin() << endl;
return 0;
}