讲师中心 微信公众号

工具推荐

视频效率加速
Laper
Laper

剧本策划到成片协作

AniShort
AniShort

AI短剧协同制作平台

立刻MV
立刻MV

低成本歌曲 MV、视频生成

updream

一键生成高质量推广成片

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

冬静吖_9828

冬静吖_9828

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

|

708人浏览过

|

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

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

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

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

示例:

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

和 lower_bound / upper_bound 的关系别搞混

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

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

所以别这么写:

auto low = std::lower_bound(v.begin(), v.end(), x);<br>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::map 和 std::set 本身有序,但它们的 equal_range 成员函数(非算法版)更合适——它返回的是容器自己的迭代器类型,且针对红黑树做了优化。

别这样:

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

要这样:

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

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

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

相关专题

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

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

1158

2023.09.04

string转int
string转int

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

7519

2023.08.02

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

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

3565

2024.08.29

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

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

4708

2025.08.29

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

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

3145

2025.08.29

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

399

2026.04.23

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

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

730

2025.09.05

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

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

343

2025.11.16

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

20

2026.11.12

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn