stl equal_range的比较器这样用

本文详细解析了STL中equal_range函数的比较器使用误区,指出其并非简单等于比较,而是遵循排序规则。通过源码分析,揭示了equal_range实际通过lower_bound和upper_bound寻找指定值的边界,为理解和正确使用该函数提供了清晰指导。
摘要由CSDN通过智能技术生成

stl equal_range的比较器不是我以为的那样,看过源码,查了别人的资料才了解

我以为equal_range的比较器一定是[](val a, val b){return a == b;}, 实际上,它跟sort的比较器是一样的。是[](val a, val b){return a < b;}(假如升序排列的话)。

看源码,先二分找到一个it, 此it符合如下条件:!_Pre(*it, val) && !Pre(val, *it),翻译成汉语的话就是,*it == val, 就是找到一个在equal_range范围的指针,然后用lower_bound,upper_bound找到两头的指针,返回就可以了。

就是这样的。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`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、付费专栏及课程。

余额充值