STL 源代码剖析 算法 stl_algo.h -- equal_range
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie
equal_range(应用于有序区间)
--------------------------------------------------------------------------------------------------------------------------------------
描写叙述:利用二分查找找到一个区间,区间里的全部值都等于给定值,返回的是一个pair。
分别存储区间的上界迭代器和下界迭代器
源代码:
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 ,这时左右两个区间可能已经缩小了很多。 // 再利用 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相关推荐
- STL 源代码剖析 算法 stl_algo.h -- search
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie search --------------------------------------- ...
- STL 源代码分析 算法 stl_algo.h -- includes
本文senlie原,转载请保留此地址:http://blog.csdn.net/zhengsenlie includes(应用于有序区间) ------------------------------ ...
- 《STL源代码剖析》---stl_set.h阅读笔记
SET是STL中的标准容器,SET里面的元素会依据键值自己主动排序,它不像map那样拥有实值value和键值key的相应,set仅仅有实值.SET的底层实现时RB-tree,当插入到RB-tree中后 ...
- STL之hashtable源代码剖析
// Filename: stl_hashtable.h// 本实作的hashtable採用的是开链法, 其内存布局例如以下// 对于产生哈希冲突的结点, 我们採取在其位置维护一个链表才处理之 // ...
- STL源码剖析 算法章节 算法总览
(以 下 "质变"栏意指mutating,意思是 "会改变其操作对象之内容") 其余注意事项 将无效的迭代器传给某个算法,虽然是一种错误,却不保证能够在编译时期 ...
- STL源码剖析 算法开篇
STL源码剖析 算法章节 算法总览_CHYabc123456hh的博客-CSDN博客 质变算法 质变算法 - 会改变操作对象的数值,比如互换.替换.填写.删除.排列组合.分隔.随机重排.排序等 #in ...
- C++ STL 常用查找算法
C++ STL 常用查找算法 adjacent_find() 在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的迭代器.否则返回past-the-end. ...
- 【Java集合源代码剖析】TreeMap源代码剖析
转载请注明出处:http://blog.csdn.net/ns_code/article/details/36421085 前言 本文不打算延续前几篇的风格(对全部的源代码加入凝视),由于要理解透Tr ...
- python比较两个列表的重合度_#源代码#超几何分布算法介绍及python下的实现代码...
原标题:#源代码#超几何分布算法介绍及python下的实现代码 超几何分布是统计学上一种离散概率分布.它描述了由有限个物件中抽出n个物件,成功抽出指定种类的物件的次数(不归还). 在产品质量的不放回抽 ...
最新文章
- c#_winform打开关闭时淡入淡出
- 【算法竞赛学习】二手车交易价格预测-Task5模型融合
- 第二篇 Python图片处理模块PIL(pillow)
- 【ES10(2019)】Symbol 扩展 Symbol.prototype.description
- Confluence 6 选项 1 – 在 Confluence 中手动重建用户和用户组
- dwz ajax session超时跳转登录页(struts2自定义阻碍器)
- 每个人都应有自己的作品
- vba自动生成html,动态生成嵌入在VBA电子邮件生成中的HTML表
- WEB服务器Nginx WINDOWS最简部署
- Linux查找文件路径
- 《TCP/IP详解 卷1:协议》学习笔记(未完待续)
- 计算机写给未来自己的一段话,写给未来的自己一句话致未来自己的句子简短励志...
- 微信公众号举报能封号吗
- 如何将图片一键重命名按顺序_图片批量重命名工具(RenameIt)
- 微信公众平台开发四六级成绩查询
- 收藏优秀外贸平台B2B网站 开发国外客户用什么平台
- 28 python pandas 摘选考勤生成考勤日历表
- 微信内置浏览器 缓存清理
- Jackson序列化时实现任意类型自定义转换
- 软件开发大牛们需要遵守的10大原则