STL 源代码剖析 算法 stl_algo.h -- equal_range
本文為senlie原創,轉載請保留此地址:http://blog.csdn.net/zhengsenlie
equal_range(應用于有序區間)
--------------------------------------------------------------------------------------------------------------------------------------
描寫敘述:利用二分查找找到一個區間,區間里的全部值都等于給定值,返回的是一個pair。
分別存儲區間的上界迭代器和下界迭代器
源代碼:
先找 value ,這時左右兩個區間可能已經縮小了很多。 // 再利用 lower_bound 和 upper_bound 代價小非常多 half = len >> 1; middle = first; advance(middle, half); if (*middle < value) { first = middle; ++first; len = len - half - 1; } else if (value < *middle) len = half; else { left = lower_bound(first, middle, value); advance(first, len); right = upper_bound(++middle, first, value); return pair<ForwardIterator, ForwardIterator>(left, right); } } return pair<ForwardIterator, ForwardIterator>(first, first); } // RandomAccessIterator 版本號 template <class RandomAccessIterator, class T, class Distance> pair<RandomAccessIterator, RandomAccessIterator> __equal_range(RandomAccessIterator first, RandomAccessIterator last, const T& value, Distance*, random_access_iterator_tag) { Distance len = last - first; Distance half; RandomAccessIterator middle, left, right; while (len > 0) { half = len >> 1; middle = first + half; if (*middle < value) { first = middle + 1; len = len - half - 1; } else if (value < *middle) len = half; else { left = lower_bound(first, middle, value); right = upper_bound(++middle, first + len, value); return pair<RandomAccessIterator, RandomAccessIterator>(left, right); } } return pair<RandomAccessIterator, RandomAccessIterator>(first, first); }
演示樣例:
int main() {int A[] = { 1, 2, 3, 3, 3, 5, 8 };const int N = sizeof(A) / sizeof(int);for (int i = 2; i <= 4; ++i) {pair<int*, int*> result = equal_range(A, A + N, i);cout << endl;cout << "Searching for " << i << endl;cout << " First position where " << i << " could be inserted: "<< result.first - A << endl;cout << " Last position where " << i << " could be inserted: "<< result.second - A << endl;if (result.first < A + N)cout << " *result.first = " << *result.first << endl;if (result.second < A + N)cout << " *result.second = " << *result.second << endl;} } ?/* The output is: Searching for 2First position where 2 could be inserted: 1Last position where 2 could be inserted: 2*result.first = 2*result.second = 3Searching for 3First position where 3 could be inserted: 2Last position where 3 could be inserted: 5*result.first = 3*result.second = 5Searching for 4First position where 4 could be inserted: 5Last position where 4 could be inserted: 5*result.first = 5*result.second = 5*/
總結
以上是生活随笔為你收集整理的STL 源代码剖析 算法 stl_algo.h -- equal_range的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LVS-DR配置
- 下一篇: NGUI 3.5教程(二)Label 标