STL 源码剖析 算法 stl_algo.h -- lower_bound

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie

lower_bound(应用于有序区间)

--------------------------------------------------------------------------------------------------------------------------

描述:二分查找,返回一个迭代器指向每一个"不小于 value "的元素,

或 value 应该存在的位置

思路:

1.循环直到区间长度为 0

2.如果 *middle < value,在后半段继续查找

3.如果 *middle >= value,在前半段继续查找 (等于的时候也会继续在前半段查找,所以能保证找到的是 lower bound)

源码:

template <class ForwardIterator, class T>
inline ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last,
                                   const T& value) {
  return __lower_bound(first, last, value, distance_type(first),
                       iterator_category(first));
}

// forward_iterator_tag 版本
template <class ForwardIterator, class T, class Distance>
ForwardIterator __lower_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;
    middle = first;
    advance(middle, half); // 因为只是 ForwardIterator,不能采用 middle = middle + half 的方式
    if (*middle < value) {
      first = middle;
      ++first;
      len = len - half - 1;
    } // 因为 *middle >= value 时,会在前半段继续查找,所以最终找到的是 lower bound
    else
      len = half;
  }
  return first;
}

// random_access_iterator_tag 版本
template <class RandomAccessIterator, class T, class Distance>
RandomAccessIterator __lower_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; //除以2
    middle = first + half;
    if (*middle < value) {
      first = middle + 1;
      len = len - half - 1; // -half-1 是因为前面那段有first指向的元素和half指向的区间
    }
    else //为什么这样的代码能保证找到的是 lower bound ?--> 因为小于等于都是到前面一段区间查找,所以最后找到的一定是 lower bound
      len = half;
  }
  return first;
}

示例:

int main()
{
  int A[] = { 1, 2, 3, 3, 3, 5, 8 };
  const int N = sizeof(A) / sizeof(int);

  for (int i = 1; i <= 10; ++i) {
    int* p = lower_bound(A, A + N, i);
    cout << "Searching for " << i << ".  ";
    cout << "Result: index = " << p - A << ", ";
    if (p != A + N)
      cout << "A[" << p - A << "] == " << *p << endl;
    else
      cout << "which is off-the-end." << endl;
  }
}
/*
The output is:
Searching for 1.  Result: index = 0, A[0] == 1
Searching for 2.  Result: index = 1, A[1] == 2
Searching for 3.  Result: index = 2, A[2] == 3
Searching for 4.  Result: index = 5, A[5] == 5
Searching for 5.  Result: index = 5, A[5] == 5
Searching for 6.  Result: index = 6, A[6] == 8
Searching for 7.  Result: index = 6, A[6] == 8
Searching for 8.  Result: index = 6, A[6] == 8
Searching for 9.  Result: index = 7, which is off-the-end.
Searching for 10.  Result: index = 7, which is off-the-end.
*/

STL 源码剖析 算法 stl_algo.h -- lower_bound,布布扣,bubuko.com

时间: 2024-10-14 08:23:05

STL 源码剖析 算法 stl_algo.h -- lower_bound的相关文章

STL 源码剖析 算法 stl_algo.h -- binary_search

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie binary_search ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 描

STL 源码剖析 算法 stl_algo.h -- equal_range

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie equal_range(应用于有序区间) -------------------------------------------------------------------------------------------------------------------------------------- 描述:利用二分查找找到一个区间,区间里的所有值都等于给定值,返回的是一个pair

STL 源码剖析 算法 stl_algo.h -- inplace_merge

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie inplace_merge(应用于有序区间) -------------------------------------------------------------------- 描述:如果两个连接在一起的序列[first, middle)和 [middle, last]都已排序, 那么 inplace_merge 可将它们结合成单一一个序列,并仍有序. 源码: template <c

STL 源码剖析 算法 stl_algo.h -- search_n

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie search_n ---------------------------------------------------------------------------------------- 描述:在序列[first, last) 所涵盖的区间中,查找"连续 count 个符合条件之元素"所形成的子序列, 并返回迭代器 last 思路: 1.首先找出 value 第一次出现点

STL 源码剖析 算法 stl_algo.h -- upper_bound

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie upper_bound(应用于有序区间) ------------------------------------------------------------------------------------------------------------------------------------------------- 描述:受STL区间前闭后开习惯的影响,upper_boun

STL 源码剖析 算法 stl_algo.h -- next_permutation

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie next_permutation ----------------------------------------------------------------------- 描述: 取得 [first, last) 所标示之序列的下一个排列组合.如果没有,返回 false,有,返回true 思路: 从后往前 1.找两个相邻元素,令左端的元素为*i,右端的元素为*ii,且满足 *i <

STL 源码剖析 算法 stl_algo.h -- pre_permutation

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie pre_permutation ---------------------------------------------------------------- 描述: 取得 [first, last) 所标示之序列的前一个排列组合.如果没有,返回 false,有,返回true 思路: 从后往前 1.找两个相邻元素,令左端的元素为*i,右端的元素为*ii,且满足 *i > *ii 2.找出

STL 源码剖析 算法 stl_algo.h -- random_shuffle

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie random_shuffle -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 描述:将[first

STL 源码剖析 算法 stl_algo.h -- partial_sort / partial_sort_copy

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie partial_sort / partial_sort_copy ----------------------------------------------------------------------------------------------------------------------------------------- 描述:本算法接受一个 middle 迭代器(位于序