0. 函数的声明

  • 可以看到:返回一个 std::pair<ForwardIt,ForwardIt>pair 对)
template< class ForwardIt >
std::pair<ForwardIt,ForwardIt>minmax_element( ForwardIt first, ForwardIt last );

1. 寻找最小值和最大值

  • 使用
  • 顾名思义,从函数名看,minmax_element,先是 min,再 max,所以,返回的类中的数据成员 first 对应着最小值second 对应着最大值
  • 源码
template<class ForwardIt, class Compare>
std::pair<ForwardIt, ForwardIt> minmax_element(ForwardIt first, ForwardIt last, Compare comp)
{auto min = first, max = first;if (first == last || ++first == last)return {min, max};if (comp(*first, *min)) {min = first;} else {max = first;}while (++first != last) {auto i = first;if (++first == last) {if (comp(*i, *min)) min = i;else if (!(comp(*i, *max))) max = i;break;} else {if (comp(*first, *i)) {if (comp(*first, *min)) min = first;if (!(comp(*i, *max))) max = i;} else {if (comp(*i, *min)) min = i;if (!(comp(*first, *max))) max = first;}}}return {min, max};
}
  • 例子:
#include <iostream>int main() {std::vector<int> v = { 1, 2, 5, 4, 100, 0, -199, 33 };auto result = std::minmax_element(v.begin(), v.end());// 输出首次出现的最小元素std::cout << "min element is: " << *result.first << '\n';// 输出首次出现的最大元素std::cout << "max element is: " << *result.second << '\n';return 0;
}/*
// 官网例子
#include <algorithm>
#include <iostream>int main() {const auto v = { 3, 9, 1, 4, 2, 5, 9 };auto pStart = begin(v);auto pEnd = end(v);const auto result = std::minmax_element(begin(v), end(v));std::cout << "min = " << *result.first << ", max = " << *result.second << '\n';return 0;
}
*/
  • 结果:

2. 其它类似的函数

1. C++17 中的 min_element, 返回迭代器位置, 复杂度为 O(n)

  • 源码
template<class ForwardIt>
ForwardIt min_element(ForwardIt first, ForwardIt last)
{if (first == last) return last;ForwardIt smallest = first;++first;for (; first != last; ++first) {if (*first < *smallest) {smallest = first;}}return smallest;
}
  • 例子
#include <algorithm>
#include <iostream>
#include <vector>int main()
{std::vector<int> v{3, 1, 4, 1, 5, 9};std::vector<int>::iterator result = std::min_element(v.begin(), v.end());std::cout << "min element at: " << std::distance(v.begin(), result) << std::endl;std::cout << "min value is: " << *result << std::endl;             // 1return 0;
}

2. C++17 中的 max_element, 返回迭代器位置, 复杂度为 O(n)

  • 源码
template<class ForwardIt>
ForwardIt max_element(ForwardIt first, ForwardIt last)
{if (first == last) return last;ForwardIt largest = first;++first;for (; first != last; ++first) {if (*largest < *first) {largest = first;}}return largest;
}
  • 例子
#include <algorithm>
#include <iostream>
#include <vector>int main()
{std::vector<int> v{3, 1, 4, 1, 5, 9};std::vector<int>::iterator result = std::max_element(v.begin(), v.end());std::cout << "max element at: " << std::distance(v.begin(), result) << std::endl;std::cout << "max value is: " << *result << std::endl;                 // 9return 0;
}

3. 参考

https://en.cppreference.com/w/cpp/algorithm

笔记 C++11 std::minmax_element() 的使用(寻找最小值和最大值)相关推荐

  1. C++学习笔记 C++11 std::chrono知识

    来源于:https://www.cnblogs.com/jwk000/p/3560086.html,有删改 chrono是一个time library, 源于boost,现在已经是C++标准.要使用c ...

  2. 台湾国立大学郭彦甫Matlab教程笔记(11) advanced 2D plots 上

    台湾国立大学郭彦甫Matlab教程笔记(11) today: 1.advanced 2D plots 2.color space色彩使用 3.3D plots 图形概览,做研究的时候需要选择图形 sp ...

  3. ansible笔记(11):初识ansible playbook(二)

    ansible笔记(11):初识ansible playbook(二)有前文作为基础,如下示例是非常容易理解的:--- - hosts: test211remote_user: roottasks:- ...

  4. Linux第二周学习笔记(11)

    Linux第二周学习笔记(11) 2.17 隐藏权限lsattr_chattr chattr命令:是设置吟唱隐藏权限的命令,更改Linux文件系统上的文件属性. 参数说明: A:表示文件或目录的ati ...

  5. C++11 std::bind std::function 高级用法

    C++11 std::bind std::function 高级用法 (c++11的新特性) 原文:https://blog.csdn.net/yangjie6898862/article/detai ...

  6. Android菜鸟的成长笔记(11)——Android中的事件处理

    原文: [置顶] Android菜鸟的成长笔记(11)--Android中的事件处理 Android提供了两种方式来处理事件,一个是基于回调的事件处理,另一个是基于监听的事件处理,举个例子: 基于回调 ...

  7. FreeRtos学习笔记(11)查找就绪任务中优先级最高任务原理刨析

    FreeRtos学习笔记(11)查找就绪任务中优先级最高任务原理刨析 怎么查找就绪任务中优先级最高的? tasks.c中声明了一个全局变量 uxTopReadyPriority,任务从其他状态进入就绪 ...

  8. C# 学习笔记(11)蓝屏小工具

    C# 学习笔记(11)蓝屏小工具 加载界面参考 C# Winform 现代化扁平化启动界面设计https://www.bilibili.com/video/BV17E41147wM PS做一张图 70 ...

  9. C++11 std::function, std::bind, std::ref, std::cref

    C++11 std::function, std::bind, std::ref, std::cref 转自:http://www.jellythink.com/ std::function 看看这段 ...

最新文章

  1. 这家公司耕耘超算20年,连续3年世界第一,现在加速中国AI
  2. 放弃 PowerPoint,改用 reveal.js
  3. DCGAN生成cifar10, cifar100, mnist, fashion_mnist,STL10,Anime图片(pytorch)
  4. qt 进程打开excel_Qt QAxObject操作excel文件过程总结(转):(示例代码)
  5. oracle leg函数,032-函数的嵌套与LEGB原则
  6. php通知多有人,PHP通知抑制;只有某些情况/方法
  7. mac mysql的初始密码_MAC版修改MySQL初始密码的方法
  8. 信息学奥赛一本通 1141:删除单词后缀 | OpenJudge NOI 1.7 20
  9. noip2010乌龟棋解题报告
  10. 解密微信介入智能硬件的逻辑
  11. Opencv_HIGHGUI ERROR: V4L/V4L2: VIDIOC_S_CROP解决方案
  12. Atitit 语义网的实现技术 目录 1. 语义网概念及技术综述 1 2. 图2-1 语义网的体系结构 2 2.1. 第1层:基础层,主要包含Unicode和URI(Uniform resource
  13. 到底什么才是自动化巡检?
  14. 不要卡巴斯基!(卡巴斯基授权许可文件出错,其它软件受连累)
  15. 二维码中间嵌入logo
  16. word2vec及其优化
  17. PIC16F887 单片机 灯光控制系统 PROTEUS 基于单片机的灯光控制系统
  18. IOS开发音频与视频
  19. java 运行时获取泛型真实类型
  20. 亚马逊kindle设置_在亚马逊Kindle上追逐活跃的社会工程欺诈

热门文章

  1. linux下scp的常见问题解决方法
  2. [Pytorch系列-35]:卷积神经网络 - 搭建LeNet-5网络与CFAR10分类数据集
  3. 2020中职技能高考计算机,我市62名中职学生获得2020年技能高考操作考试满分
  4. LeanCloud 将加入心动/TapTap
  5. JavaScript字符串(Date和Math对象)的相关操作及实例
  6. Lenovo 10w 平板评测
  7. Jdon DDD分析法
  8. java structs,国内最早Struts专题Java - 解道Jdon
  9. Android中如何利用Minui显示PNG格式的图片
  10. 三维建模初学者学习方法及资料