前面一节我们学习了upper_bound()函数,该函数的功能是在指定有序区间内查找第一个高于目标元素的元素。本节我们开始学习新的二分查找函数——equal_range()函数。“equal”意为“对等的”,“range”意为“范围”,equal_range()函数的功能是在指定有序范围内查找等于目标元素的元素范围,作用区间和upper_bound()函数一样都必须为有序区间,比如我们有一个有序序列{1,3,3,3,5},通过数组的视角来看如果我们想要查找等于3的元素范围,那它的区间就是[1,4)。
upper_bound()函数的语法格式为:
equal_range()函数函数的语法格式为: /*找到 [first, last) 范围中所有等于 val 的元素*/ pairequal_range (ForwardIterator first, ForwardIterator last, const T& val); /*找到 [first, last) 范围内所有等于 val 的元素*/ pairequal_range (ForwardIterator first, ForwardIterator last, const T& val, Compare comp);
equal_range(first, last, val) 函数的功能是在指定有序区间 [first, last) 内找到等于目标元素的元素范围,返回类型为 pair<iterator, iterator>。如果找到相等的元素,则返回 {指向第一个相等元素的迭代器, 指向最后一个相等元素的下一个位置的迭代器};如果没有找到相等的元素,则返回 {指向第一个大于 val 的元素迭代器, 指向第一个大于 val 的元素迭代器},即两个迭代器相等,表示应该插入的位置。
下面我们通过equal_range(first, last,val)来查找有序序列{1,3,3,3,5}中元素==3的区间:
#include<iostream>
#include<vector>
#include<iterator> //使用distance()来获取下标
#include<algorithm>//需包含算法头文件才能使用equal_range()函数
using namespace std;
/*equal_range(first, last,val)*/
void test()
{
vector<int> v{1,3,3,3,5};
cout << "原序列为:";
for(auto it = v.begin();it!=v.end();++it)cout << *it << " ";
cout << '\n';
/*查找元素==3的范围*/
pair<vector<int>::iterator,vector<int>::iterator> range =equal_range(v.begin(),v.end(),3);
if(range.first!=range.second)//找到该区间
{
cout << "在{1,3,3,3,5}找到元素==3的区间为:[" << distance(v.begin(),range.first)<< ","<<distance(v.begin(),range.second)<< ")\n" ;
}
}
int main(){
system("title dotcpp.com");
test();
return 0;
}编译结果如下:

对于有序序列{1,3,3,3,5}来说,以数组的视角来看元素==3的区间为[1,4),输出完全符合我们的预期!
总结:equal_range(first, last,val)函数是有序数据范围查询的“利器”,在蓝桥杯、ACM等算法竞赛上该函数主要应用于统计重复元素、高效处理有序范围查询和离散化数据处理等。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程