0

0

c++如何使用std::minmax_c++同时获取最大最小值【常用】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-02-11 09:57:17

|

317人浏览过

|

来源于php中文网

原创

std::minmax是C++11引入的算法,单次遍历同时返回最小值和最大值(.first为最小,.second为最大),避免对单向迭代器重复遍历,返回值而非迭代器,需包含且不可用于空范围。

c++如何使用std::minmax_c++同时获取最大最小值【常用】

std::minmax 是什么,为什么不用两次调用 std::min 和 std::max

std::minmax 是 C++11 引入的实用算法,用于**单次遍历**同时返回最小值和最大值。相比分别调用 std::minstd::max(会遍历容器两次),它对迭代器范围只需一次比较 —— 对 std::vector、数组等随机访问容器,性能提升不明显;但对 std::list 或输入流这类仅支持单向遍历的序列,**避免重复遍历是关键优势**。

它返回一个 std::pair,其中 .first 是最小值,.second 是最大值(注意不是按升序排列的 pair,而是固定语义)。

如何正确调用 std::minmax(含常见编译错误)

必须包含头文件 ,且需启用 C++11 或更高标准(如编译时加 -std=c++11)。常见错误包括:

  • 忘记 #include → 报错:‘minmax’ was not declared in this scope
  • 用在 C++98 模式下 → 编译失败,无回退机制
  • 传入空范围(如空 vector 的 begin()/end())→ 行为未定义,**不会抛异常,也不会断言**,务必提前检查

基础用法示例:

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

#include 
#include 
#include 

std::vector v = {3, 1, 4, 1, 5};
auto p = std::minmax(v.begin(), v.end());
std::cout << "min=" << *p.first << ", max=" << *p.second << "\n";
// 输出:min=1, max=5

std::minmax 与 std::minmax_element 的区别

这是最容易混淆的一对函数:

Creatext AI
Creatext AI

专为销售人员提供的 AI 咨询辅助工具

下载
  • std::minmax:直接返回**值本身**(要求元素可拷贝/移动),适用于小对象或需要值的场景
  • std::minmax_element:返回**迭代器**(指向最小/最大元素的位置),适用于大对象(避免拷贝)、需要修改原容器元素、或需获取索引位置的场景

例如,想把最大值改成 0,必须用 std::minmax_element

auto it_pair = std::minmax_element(v.begin(), v.end());
*it_pair.second = 0; // OK:通过迭代器修改
// *std::minmax(v.begin(), v.end()).second = 0; // 错误:返回的是临时值,不可赋值

自定义比较逻辑与性能注意事项

std::minmax 支持传入二元谓词(比如按绝对值比较):

std::vector v = {-5, 3, -1, 4};
auto p = std::minmax(v.begin(), v.end(), 
    [](int a, int b) { return std::abs(a) < std::abs(b); });
// p.first 指向 -1(abs=1),p.second 指向 -5 或 5(abs=5)

注意点:

  • 比较函数必须满足严格弱序(strict weak ordering),否则行为未定义
  • 对于 std::initializer_list,有重载版本 std::minmax({1,2,3}),返回 std::pair,引用绑定到临时 list,生命周期安全
  • 若只关心最大最小值之一,别硬套 std::minmax —— 单次调用 std::min_elementstd::max_element 更清晰,也更易被编译器优化

真正容易被忽略的是:当元素类型重载了 operator 但语义不稳定(比如浮点数 NaN 比较),std::minmax 的结果可能不符合直觉,此时应显式传入稳定谓词或预处理 NaN。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

541

2023.09.20

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是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

556

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

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

441

2023.08.14

Docker容器化部署与DevOps实践
Docker容器化部署与DevOps实践

本专题面向后端与运维开发者,系统讲解 Docker 容器化技术在实际项目中的应用。内容涵盖 Docker 镜像构建、容器运行机制、Docker Compose 多服务编排,以及在 DevOps 流程中的持续集成与持续部署实践。通过真实场景演示,帮助开发者实现应用的快速部署、环境一致性与运维自动化。

0

2026.02.11

Rust异步编程与Tokio运行时实战
Rust异步编程与Tokio运行时实战

本专题聚焦 Rust 语言的异步编程模型,深入讲解 async/await 机制与 Tokio 运行时的核心原理。内容包括异步任务调度、Future 执行模型、并发安全、网络 IO 编程以及高并发场景下的性能优化。通过实战示例,帮助开发者使用 Rust 构建高性能、低延迟的后端服务与网络应用。

1

2026.02.11

Spring Boot企业级开发与MyBatis Plus实战
Spring Boot企业级开发与MyBatis Plus实战

本专题面向 Java 后端开发者,系统讲解如何基于 Spring Boot 与 MyBatis Plus 构建高效、规范的企业级应用。内容涵盖项目架构设计、数据访问层封装、通用 CRUD 实现、分页与条件查询、代码生成器以及常见性能优化方案。通过完整实战案例,帮助开发者提升后端开发效率,减少重复代码,快速交付稳定可维护的业务系统。

3

2026.02.11

热门下载

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

精品课程

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

共94课时 | 9.1万人学习

C 教程
C 教程

共75课时 | 4.6万人学习

C++教程
C++教程

共115课时 | 17万人学习

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

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