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;
- }