upper_bound()函数返回插入value的最后一个位置,该函数要求目标序列必须是有序。另外,如果value已经存在于目标序列,upper_bound将返回value的下一位置,而lower_bound则会返回value的位置。
- template <class ForwardIterator, class T>
- inline ForwardIterator upper_bound(ForwardIterator first,
- ForwardIterator last,
- const T &value) {
- return __upper_bound(first, last, value,
- distance_type(first), iterator_category(first));
- }
- // forward iterator 版本
- template <class ForwardIterator, class T, class Distance>
- ForwardIterator __upper_bound(ForwardIterator first,
- ForwardIterator last,
- const T &value,
- Distance*,
- forward_iterator_tag) {
- Distance len = 0;
- distance(first, last, len);
- Distance half;
- ForwardIterator middle;
- while(len > 0) {
- half = len >> 1;
- advance(middle, half);
- if(value < *middle)
- len = half;
- else {
- first = middle;
- ++first;
- len = len - half - 1;
- }
- }
- return first;
- }
- // random access iterator 版本
- template <class RandomAccessIterator, class T, class Distance>
- RandomAccessIterator __upper_bound(RandomAccessIterator first,
- RandomAccessIterator last,
- const T &value,
- Distance*,
- random_access_iterator_tag) {
- Distance len = last - first;
- Distance half;
- RandomAccessIterator middle;
- while(len > 0) {
- half = len >> 1;
- middle = first + half;
- if(value < *middle)
- len = half;
- else {
- first = middle + 1;
- len = len - half - 1;
- }
- }
- return first;
- }
转载于:https://blog.51cto.com/zxn990/1172882