0

0

C++中的std::equal_range是什么?(如何获取重复元素的范围)

冰火之心

冰火之心

发布时间:2026-02-10 10:23:11

|

648人浏览过

|

来源于php中文网

原创

std::equal_range在有序序列中查找目标值的左闭右开相等区间,返回first(首个≥目标)和second(首个>目标)迭代器;需确保容器已排序且比较器满足严格弱序,否则行为未定义。

c++中的std::equal_range是什么?(如何获取重复元素的范围)

std::equal_range 查的是“等于某值”的左闭右开区间

它返回一个 std::pair,其中 first 指向第一个不小于目标值的元素,second 指向第一个大于目标值的元素。当容器有序且含重复项时,这两者正好框住所有等于目标的元素——也就是你要的“重复元素范围”。

关键前提:必须用在已排序的序列上(比如 std::vector 调过 std::sort,或 std::set),否则行为未定义。

常见错误现象:std::equal_range 返回空范围(it == end),但你以为数据丢了——其实是容器没排好序,或者你传了错误的比较器。

  • 使用场景:查 std::vector 里所有 5 的位置;在日志时间戳数组中批量提取某秒内的全部记录
  • 参数差异:第三个参数可传自定义比较函数,比如 std::equal_range(v.begin(), v.end(), key, [](int a, int b) { return a ;若省略,则默认用
  • 性能影响:二分查找,O(log n);比遍历快得多,但要求随机访问迭代器(std::list 不支持)

怎么拿到重复元素的起始和结束迭代器

调用后直接解包 firstsecond 即可,别手抖写成 second - 1 去取最后一个——它本来就是右开区间,[first, second) 已经是完整范围。

立即学习C++免费学习笔记(深入)”;

示例:

std::vector v = {1, 2, 2, 2, 3, 4, 4};
auto range = std::equal_range(v.begin(), v.end(), 2);
// range.first → 指向索引 1 的 2
// range.second → 指向索引 4 的 3(不是最后一个 2!)
// 所以 [range.first, range.second) 包含索引 1、2、3 三个 2
  • 容易踩的坑:对 std::vectorstd::equal_range 后,误用 std::distance(range.first, range.second) 计数前没确认容器是否真的有序
  • 兼容性注意:C++11 起支持;若用 std::array 或原生数组,记得传对 begin/end 迭代器,别传指针偏移出界

和 lower_bound / upper_bound 的关系别搞混

std::equal_range 等价于同时调用 std::lower_boundstd::upper_bound,但只做一次二分——效率更高,也更安全(避免两次调用间容器被意外修改)。

标贝科技
标贝科技

标贝科技-专业AI语音服务的人工智能开放平台

下载

所以别这么写:

auto low = std::lower_bound(v.begin(), v.end(), x);
auto up = std::upper_bound(v.begin(), v.end(), x); // 多一次二分,且可能不一致

应该直接用:

auto range = std::equal_range(v.begin(), v.end(), x); // 一次二分,结果严格配对
  • 为什么这样做:两个单独调用可能因容器变动或浮点比较误差导致 low > up,而 equal_range 内部保证 first ≤ second
  • 性能影响:省掉一次 O(log n) 开销;在 tight loop 或高频查询中差异明显

在 map/set 里怎么用

std::mapstd::set 本身有序,但它们的 equal_range 成员函数(非算法版)更合适——它返回的是容器自己的迭代器类型,且针对红黑树做了优化。

别这样:

std::map m = {{1,"a"},{2,"b"},{2,"c"}};
// 错!算法版不能直接用于 map 的 value_type
auto r = std::equal_range(m.begin(), m.end(), 2, /* ... */); // 编译失败

要这样:

auto r = m.equal_range(2); // 正确:调用 map::equal_range(key),返回 pair
  • 使用场景:查 std::multimap 中所有键为 "user_id" 的条目;std::multiset 中统计某值出现次数(std::distance(r.first, r.second)
  • 容易踩的坑:对 std::map(非 multimap)调 equal_range 总是返回最多一个元素的范围;想存重复键,必须用 std::multimap

最常被忽略的一点:std::equal_range 对浮点数或自定义类型做比较时,若比较逻辑不满足严格弱序(比如用了 ),结果不可靠——排序和查找必须用同一套规则,否则连“有序”这个前提都崩了。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

399

2023.09.04

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

668

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

555

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

193

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

205

2025.08.29

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

75

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

36

2025.11.16

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

64

2025.11.17

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

153

2026.02.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 9万人学习

C 教程
C 教程

共75课时 | 4.6万人学习

C++教程
C++教程

共115课时 | 16.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号