本文为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相关推荐

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

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

  2. STL 源代码分析 算法 stl_algo.h -- includes

    本文senlie原,转载请保留此地址:http://blog.csdn.net/zhengsenlie includes(应用于有序区间) ------------------------------ ...

  3. 《STL源代码剖析》---stl_set.h阅读笔记

    SET是STL中的标准容器,SET里面的元素会依据键值自己主动排序,它不像map那样拥有实值value和键值key的相应,set仅仅有实值.SET的底层实现时RB-tree,当插入到RB-tree中后 ...

  4. STL之hashtable源代码剖析

    // Filename: stl_hashtable.h// 本实作的hashtable採用的是开链法, 其内存布局例如以下// 对于产生哈希冲突的结点, 我们採取在其位置维护一个链表才处理之 // ...

  5. STL源码剖析 算法章节 算法总览

    (以 下 "质变"栏意指mutating,意思是 "会改变其操作对象之内容") 其余注意事项 将无效的迭代器传给某个算法,虽然是一种错误,却不保证能够在编译时期 ...

  6. STL源码剖析 算法开篇

    STL源码剖析 算法章节 算法总览_CHYabc123456hh的博客-CSDN博客 质变算法 质变算法 - 会改变操作对象的数值,比如互换.替换.填写.删除.排列组合.分隔.随机重排.排序等 #in ...

  7. C++ STL 常用查找算法

    C++ STL 常用查找算法 adjacent_find() 在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的迭代器.否则返回past-the-end. ...

  8. 【Java集合源代码剖析】TreeMap源代码剖析

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/36421085 前言 本文不打算延续前几篇的风格(对全部的源代码加入凝视),由于要理解透Tr ...

  9. python比较两个列表的重合度_#源代码#超几何分布算法介绍及python下的实现代码...

    原标题:#源代码#超几何分布算法介绍及python下的实现代码 超几何分布是统计学上一种离散概率分布.它描述了由有限个物件中抽出n个物件,成功抽出指定种类的物件的次数(不归还). 在产品质量的不放回抽 ...

最新文章

  1. c#_winform打开关闭时淡入淡出
  2. 【算法竞赛学习】二手车交易价格预测-Task5模型融合
  3. 第二篇 Python图片处理模块PIL(pillow)
  4. 【ES10(2019)】Symbol 扩展 Symbol.prototype.description
  5. Confluence 6 选项 1 – 在 Confluence 中手动重建用户和用户组
  6. dwz ajax session超时跳转登录页(struts2自定义阻碍器)
  7. 每个人都应有自己的作品
  8. vba自动生成html,动态生成嵌入在VBA电子邮件生成中的HTML表
  9. WEB服务器Nginx WINDOWS最简部署
  10. Linux查找文件路径
  11. 《TCP/IP详解 卷1:协议》学习笔记(未完待续)
  12. 计算机写给未来自己的一段话,写给未来的自己一句话致未来自己的句子简短励志...
  13. 微信公众号举报能封号吗
  14. 如何将图片一键重命名按顺序_图片批量重命名工具(RenameIt)
  15. 微信公众平台开发四六级成绩查询
  16. 收藏优秀外贸平台B2B网站 开发国外客户用什么平台
  17. 28 python pandas 摘选考勤生成考勤日历表
  18. 微信内置浏览器 缓存清理
  19. Jackson序列化时实现任意类型自定义转换
  20. 软件开发大牛们需要遵守的10大原则

热门文章

  1. SQL 列转行、行转列 - 使用sqlite演示
  2. C语言结构体和结构体数组示例 - Win32窗口程序演示
  3. 一些jquery 常用实例图解
  4. Struts2 - 在Action类中获得HttpServletResponse对象
  5. ecshop 整合 QQ登陆 和 支付宝快捷登陆代码
  6. 理解Promise (2)
  7. 过滤3个字节以上的utf-8字符
  8. react --- 搭建环境
  9. 开箱即用的VScode C++环境
  10. php随机数、时间、字符串函数,正则,数组函数