0

0

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

冰火之心

冰火之心

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

|

688人浏览过

|

来源于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,但只做一次二分——效率更高,也更安全(避免两次调用间容器被意外修改)。

CodeWP
CodeWP

针对 WordPress 训练的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中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

688

2023.08.02

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

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

559

2024.08.29

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

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

193

2025.08.29

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

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

206

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

2026春节习俗大全
2026春节习俗大全

本专题整合了2026春节习俗大全,阅读专题下面的文章了解更多详细内容。

189

2026.02.11

热门下载

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

精品课程

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

共94课时 | 9.2万人学习

C 教程
C 教程

共75课时 | 4.7万人学习

C++教程
C++教程

共115课时 | 17.2万人学习

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

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