日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2025/4/5 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STL 源代码剖析 算法 stl_algo.h -- equal_range 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文為senlie原創(chuàng),轉載請保留此地址:http://blog.csdn.net/zhengsenlie


equal_range(應用于有序區(qū)間)

--------------------------------------------------------------------------------------------------------------------------------------
描寫敘述:利用二分查找找到一個區(qū)間,區(qū)間里的全部值都等于給定值,返回的是一個pair。
分別存儲區(qū)間的上界迭代器和下界迭代器

源代碼:

template <class ForwardIterator, class T> inline pair<ForwardIterator, ForwardIterator> equal_range(ForwardIterator first, ForwardIterator last, const T& value) {return __equal_range(first, last, value, distance_type(first),iterator_category(first)); }// ForwardIterator 版本號 template <class ForwardIterator, class T, class Distance> pair<ForwardIterator, ForwardIterator> __equal_range(ForwardIterator first, ForwardIterator last, const T& value,Distance*, forward_iterator_tag) {Distance len = 0;distance(first, last, len);Distance half;ForwardIterator middle, left, right;while (len > 0) { // 奇怪? 為什么不直接用 lower_bound 、 upper_bound , 而是等找到值再用?// --> 我認為是效率方面的考慮。

先找 value ,這時左右兩個區(qū)間可能已經(jīng)縮小了很多。 // 再利用 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。