0

0

C++怎么使用upper_bound_C++范围查询教程【定位】

冰火之心

冰火之心

发布时间:2026-02-27 12:29:02

|

166人浏览过

|

来源于php中文网

原创

c++标准库中只有std::upper_bound,不存在upper_bound_c++;它定义在中,要求容器已排序且使用随机访问迭代器才能实现o(log n)效率。

c++怎么使用upper_bound_c++范围查询教程【定位】

别用 upper_bound_C++ —— 这根本不是标准 C++ 的函数名,编译器会直接报错。

为什么找不到 upper_bound_C++

这是个典型命名混淆:C++ 标准库只有 std::upper_bound,没有带下划线和语言后缀的变体。你搜到的“upper_bound_C++”多半是文档误写、博客标题党,或是旧版自定义封装函数(非标准)。

  • 标准头文件是 <algorithm></algorithm>,不是 <algorithm.h></algorithm.h> 或其他拼写
  • 必须显式指定命名空间:std::upper_bound,不能裸写 upper_bound(除非有 using,但不推荐)
  • 它只接受**已排序**的范围,否则行为未定义 —— 不会报错,但结果完全不可靠

std::upper_bound 的基本用法和参数陷阱

它返回第一个 > value 的迭代器,不是下标,也不是布尔值。常见误用是当成“是否存在”的判断函数。

  • 签名是 std::upper_bound(first, last, value),其中 firstlast 是左闭右开区间(last 不参与比较)
  • 第三个参数类型必须和容器元素可比较;若用自定义类型,需提供 operator 或传入比较函数
  • std::vector<int></int> 操作时,别直接传数组名 —— 数组名退化为指针,std::upper_bound(arr, arr + n, x) 才对
  • 返回值要判是否等于 last,否则解引用可能越界:if (it != vec.end()) { use *it; }
std::vector<int> v = {1, 2, 2, 3, 4, 4, 4, 5};
auto it = std::upper_bound(v.begin(), v.end(), 4); // 指向末尾的 5
// it - v.begin() == 7,不是“4 的个数”

std::lower_bound 配合查范围时的坑

想查某个值出现的全部位置?得用 lower_boundupper_bound 配合,但二者语义不对称:

Spell.tools
Spell.tools

高颜值AI内容营销创作工具

下载

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

  • lower_bound 返回第一个 ≥ value 的位置
  • upper_bound 返回第一个 > value 的位置
  • 所以 [lower, upper) 正好是所有 == value 的元素区间 —— 注意是左闭右开
  • 如果 value 根本不存在,lower == upper,此时区间为空,但不会崩溃
  • 别用 upper_bound - lower_bound > 0 判断存在性,直接用 lower != upper 更准确

性能与容器选择的影响

std::upper_bound 要求随机访问迭代器才能达到 O(log n)。在 std::liststd::forward_list 上强行使用,编译可能通过(依赖 ADL 或隐式转换),但实际是线性遍历,失去二分意义。

  • 仅对 std::vectorstd::deque、原生数组等支持 it + n 的容器高效
  • std::set / std::map 自带 upper_bound 成员函数(set.upper_bound(x)),它比 std::upper_bound(set.begin(), set.end(), x) 更快,且不依赖迭代器随机访问能力
  • std::sort 排过序的 vector 再查,比反复插入进 set 再查,在批量查询场景下往往更快 —— 但得自己维护有序性

最常被忽略的一点:它不检查容器是否真有序。调试时发现结果错位,第一反应不该是改算法,而是加一句 std::is_sorted(v.begin(), v.end()) 确认 —— 尤其当数据来自外部输入或中间计算时。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

833

2023.08.22

sort排序函数用法
sort排序函数用法

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

404

2023.09.04

string转int
string转int

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

850

2023.08.02

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

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

592

2024.08.29

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

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

294

2025.08.29

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

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

210

2025.08.29

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

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

77

2025.09.05

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

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

38

2025.11.16

html5播放器怎么用
html5播放器怎么用

本合集全面介绍HTML5播放器的使用方法,涵盖基础语法、自定义控制、兼容性处理及实战示例。阅读专题下面的文章了解更多详细内容。

0

2026.02.27

热门下载

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

精品课程

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

共94课时 | 10.3万人学习

C 教程
C 教程

共75课时 | 5万人学习

C++教程
C++教程

共115课时 | 19.5万人学习

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

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