C++ STL equal_range的用法

本文介绍了C++ STL中的equal_range算法,详细解释了如何在已排序的区间中寻找特定值的所有出现位置,并通过示例代码展示了算法的实际应用。

  equal_range是C++ STL中的一种二分查找的算法,试图在已排序的[first,last)中寻找value,它返回一对迭代器i和j,其中i是在不破坏次序的前提下,value可插入的第一个位置(亦即lower_bound),j则是在不破坏次序的前提下,value可插入的最后一个位置(亦即upper_bound),因此,[i,j)内的每个元素都等同于value,而且[i,j)是[first,last)之中符合此一性质的最大子区间

   如果以稍许不同的角度来思考equal_range,我们可把它想成是[first,last)内"与value等同"之所有元素形成的区间A,由于[fist,last)有序(sorted),所以我们知道"与value等同"之所有元素一定都相邻,于是,算法lower_bound返回区间A的第一个迭代器算法upper_bound返回区间A的最后一个元素的下一个位置算法equal_range则是以pair的形式将两者都返回
   即使[fist,last)并未含有"与value等同"之任何元素,以上叙述仍然合理,这种情况下,"与value等同"之所有元素形成的,其实是一个空区间,在不破坏次序的情况下,只有一个位置可以插入value,而equal_range所返回的pair,其第一和第二(都是迭代器)皆指向该位置。

#include "algostuff.hpp"
#include <iterator>
#include <ostream>


using namespace std;


int main(){
list<int> coll;
INSERT_ELEMENTS(coll,1,9);
INSERT_ELEMENTS(coll,1,9);
coll.sort();


PRINT_ELEMENTS(coll);
cout<<endl;


pair<list<int>::iterator,list<int>::iterator> range;
range =equal_range(coll.begin(),coll.end(),5);
cout<<"5 could get position"
<<distance(coll.begin(),range.first)+1
<<"up to"
<<distance(coll.begin(),range.second)+1
<<"without breaking the sorting"<<endl;
cout<<"range.first:"<<*range.first<<endl;
cout<<"range.second:"<<*range.second<<endl;
return 1;
}

输出:

 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 
5 could get position9up to11without breaking the sorting
range.first:5
range.second:6



`std::equal_range`是C++ STL中的一个算法函数,用于在已排序的容器中查找某个值的范围。它返回一个pair对象,其中第一个元素是指向第一个等于给定值的元素的迭代器,第二个元素是指向第一个大于给定值的元素的迭代器。如果没有找到给定值,则这两个迭代器均指向第一个大于给定值的元素的位置。 以下是`std::equal_range`函数的函数原型: ```c++ template<class ForwardIt, class T> std::pair<ForwardIt, ForwardIt> equal_range(ForwardIt first, ForwardIt last, const T& value); template<class ForwardIt, class T, class Compare> std::pair<ForwardIt, ForwardIt> equal_range(ForwardIt first, ForwardIt last, const T& value, Compare comp); ``` 其中: - `first`和`last`表示要查找的元素范围,必须是已排序的。 - `value`表示要查找的值。 - `comp`是可选的,表示比较函数,用于比较元素的值,默认为`std::less<T>`。 下面是一个使用`std::equal_range`函数查找vector中某个值范围的例子: ```c++ #include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> v = {1, 2, 3, 4, 4, 4, 5, 6}; auto range = std::equal_range(v.begin(), v.end(), 4); std::cout << "Range of 4: [" << std::distance(v.begin(), range.first) << ", " << std::distance(v.begin(), range.second) << ")" << std::endl; return 0; } ``` 输出: ``` Range of 4: [3, 6) ``` 这表示4在vector中的范围是从下标3到下标6之间的元素(不包括下标6)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值