【C++ std::max_element std::min_element std::minmax_element】

一 、std::max_element

1

寻找范围 [first, last) 中的最大元素。

  • (1) 用 operator< 比较元素。

  • (3) 用给定的二元比较函数 comp 比较元素。

  • (2),(4) 同 (1,3) ,但按照 policy 执行。这些重载仅若 std::is_execution_policy_v<std::decay_t > (C++20 前)std::is_execution_policy_v<std::remove_cvref_t > (C++20 起) 为 true 才参与重载决议。

参数

  • first, last - 定义要检验范围的向前迭代器
  • policy - 所用的执行策略。细节见执行策略。
  • comp - 比较函数对象(即满足[比较 Compare)要求的对象),若首个参数小于第二个,则返回 true 。 比较函数的签名应等价于如下: bool cmp(const Type1 &a, const Type2 &b);虽然签名不必有 const & ,函数也不能修改传递给它的对象,而且必须接受(可为 const 的)类型 Type1Type2 的值,无关乎值类别(从而不允许 Type1 & ,亦不允许 Type1 ,除非 Type1 的移动等价于复制 (C++11 起))。 类型 Type1 与 Type2 必须使得 ForwardIt 类型的对象能在解引用后隐式转换到这两个类型。

类型要求

-ForwardIt 必须满足 遗留向前迭代器 (LegacyForwardIterator) 的要求。

返回值

指向范围 [first, last) 中最大元素的迭代器。若范围中有多个元素等价于最大元素,则返回指向首个这种元素的迭代器。若范围为空则返回 last

复杂度

准确比较 max(N-1,0) 次,其中 N = std::distance(first, last) 。

异常

拥有名为 ExecutionPolicy 的模板形参的重载按下列方式报告错误:

  • 若作为算法一部分调用的函数的执行抛出异常,且 ExecutionPolicy 为标准策略之一,则调用 std::terminate 。对于任何其他 ExecutionPolicy ,行为是实现定义的。
  • 若算法无法分配内存,则抛出 std::bad_alloc 。

可能的实现

版本一
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;
}
版本二
template<class ForwardIt, class Compare>
ForwardIt max_element(ForwardIt first, ForwardIt last, Compare comp)
{if (first == last) {return last;}ForwardIt largest = first;++first;for (; first != last; ++first) {if (comp(*largest, *first)) {largest = first;}}return largest;
}

示例

#include <algorithm>
#include <iostream>
#include <vector>
#include <cmath>static bool abs_compare(int a, int b)
{return (std::abs(a) < std::abs(b));
}int main()
{std::vector<int> v{ 3, 1, -14, 1, 5, 9 }; std::vector<int>::iterator result;result = std::max_element(v.begin(), v.end());std::cout << "max element at: " << std::distance(v.begin(), result) << '\n';result = std::max_element(v.begin(), v.end(), abs_compare);std::cout << "max element (absolute) at: " << std::distance(v.begin(), result) << '\n';
}

输出:

max element at: 5
max element (absolute) at: 2

二、std::min_element

image-20231115152327410.png

寻找范围 [first, last) 中的最小元素。

  • (1) 用 operator< 比较元素。

  • (3) 用给定的二元比较函数 comp 比较元素。

  • (2,4) 同 (1,3) ,但按照 policy 执行。这些重载仅若 std::is_execution_policy_v<std::decay_t > (C++20 前)std::is_execution_policy_v <std::remove_cvref_t > (C++20 起) 为 true 才参与重载决议。

参数

  • first, last - 定义要检验范围的向前迭代器

  • policy - 所用的执行策略。细节见执行策略。

  • comp - 比较函数对象(即满足比较* (Compare) 要求的对象),若a 小于 b ,则返回 true 。 比较函数的签名应等价于如下: bool cmp(const Type1 &a, const Type2 &b);虽然签名不必有 const & ,函数也不能修改传递给它的对象,而且必须接受(可为 const 的)类型 Type1Type2 的值,无关乎值类别 (从而不允许 Type1 & ,亦不允许 Type1 ,除非 Type1 的移动等价于复制 (C++11 起))。 类型 Type1 与 Type2 必须使得 ForwardIt 类型的对象能在解引用后隐式转换到这两个类型。

类型要求

  • ForwardIt 必须满足遗留向前迭代器 (LegacyForwardIterator) 的要求。

返回值

指向范围 [first, last) 中最小元素的迭代器。若范围中有多个元素等价于最小元素,则返回指向首个这种元素的迭代器。若范围为空则返回 last

复杂度

准确比较 max(N-1,0) 次,其中 N = std::distance(first, last) 。

异常

拥有名为 ExecutionPolicy 的模板形参的重载按下列方式报告错误:

  • 若作为算法一部分调用的函数的执行抛出异常,且 ExecutionPolicy 为标准策略之一,则调用 std::terminate 。对于任何其他 ExecutionPolicy ,行为是实现定义的。
  • 若算法无法分配内存,则抛出 std::bad_alloc 。

可能的实现

版本一
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;
}
版本二
template<class ForwardIt, class Compare>
ForwardIt min_element(ForwardIt first, ForwardIt last, Compare comp)
{if (first == last) return last;ForwardIt smallest = first;++first;for (; first != last; ++first) {if (comp(*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(std::begin(v), std::end(v));std::cout << "min element at: " << std::distance(std::begin(v), result);
}

输出:

min element at: 1

三、std::minmax_element

image-20231115154700725.png

  • (1) 用 operator< 比较元素。

  • (3) 用给定的二元比较函数 comp 比较元素。

  • (2,4) 同 (1,3) ,但按照 policy 执行。这些重载仅若 std::is_execution_policy_v <[std::decay_t > (C++20 前)std::is_execution_policy_v<std::remove_cvref_t > (C++20 起) 为 true 才参与重载决议。。

参数

  • first, last - 定义要检验的元素范围的迭代器
  • policy - 所用的执行策略。细节见执行策略。
  • cmp - 比较函数对象(即满足比较 (Compare) 要求的对象),若若 *a 小于 *b ,则返回 true 。 比较函数的签名应等价于如下: bool cmp(const Type1 &a, const Type2 &b);虽然签名不必有 const & ,函数也不能修改传递给它的对象,而且必须接受(可为 const 的)类型 Type1Type2 的值,无关乎值类别(从而不允许 Type1 & ,亦不允许 Type1 ,除非 Type1 的移动等价于复制 (C++11 起))。 类型 Type1 与 Type2 必须使得 ForwardIt 类型的对象能在解引用后隐式转换到这两个类型。 |

类型要求

  • ForwardIt 必须满足遗留向前迭代器 (LegacyForwardIterator) 的要求。

返回值

以指向最小元素的迭代器为第一元素,以指向最大元素的迭代器为第二元素的 pair 。若范围为空则返回 std::make_pair(first, first) 。若多个元素等价于最小元素,则返回指向首个这种元素的迭代器。若多个元素等价于最大元素,则返回指向最后一个这种元素的迭代器。

复杂度

至多应用谓词 max(floor(3/2(N−1)), 0) 次,其中 N = std::distance(first, last) 。

异常

拥有名为 ExecutionPolicy 的模板形参的重载按下列方式报告错误:

  • 若作为算法一部分调用的函数的执行抛出异常,且 ExecutionPolicy 为 标准策略 之一,则调用 std::terminate 。对于任何其他 ExecutionPolicy ,行为是实现定义的。
  • 若算法无法分配内存,则抛出 std::bad_alloc。

注解

此算法不仅在效率上异于 std::make_pair(std::min_element(), std::max_element()) ,而且此算法寻找最后的最大元素,而 std::max_element 寻找首个最大元素。

可能的实现

版本一
template<class ForwardIt>
std::pair<ForwardIt, ForwardIt> minmax_element(ForwardIt first, ForwardIt last)
{using value_type = typename std::iterator_traits<ForwardIt>::value_type;return std::minmax_element(first, last, std::less<value_type>());
}
版本二
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 <algorithm>
#include <iostream>
#include <vector>int main()
{std::vector<int> v = { 3, 9, 1, 4, 2, 5, 9 };auto result = std::minmax_element(v.begin(), v.end());std::cout << "min element at: " << (result.first - v.begin()) << '\n';std::cout << "max element at: " << (result.second - v.begin()) << '\n';
}

输出:

min element at: 2
max element at: 6

整合与 C++ API Reference Document

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/178990.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt QWebSocket实现JS调用C++

目录 前言1、QWebChannel如何与网页通信2、QWebSocketQWebChannel与网页通信2.1 WebSocketTransport2.2 WebSocketClientWrapper2.3 初始化WebSocket服务器2.4 前端网页代码修改 总结 前言 本篇主要介绍实现JS调用C的另一种方式&#xff0c;即QWebSocketQWebChannel。与之前的…

JTS: 24 MinimumDiameter 最小矩形

文章目录 版本代码 版本 org.locationtech.jts:jts-core:1.19.0 链接: github 代码 package pers.stu.algorithm;import org.locationtech.jts.algorithm.MinimumDiameter; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.Geometry; import…

基于stm32f103系列的简单软件I2C和硬件I2C通讯

这篇文章主要分为三个部分来阐述&#xff0c;分别是I2C的基本知识&#xff0c;软件I2C通讯&#xff0c;硬件I2C通讯。I2C的基本知识这一块&#xff0c;部分讲解以及图表来自b站江科大的up&#xff0c;很感谢这位up&#xff0c;大家可以关注一波。操作实现的时候&#xff0c;up使…

自己动手写编译器:实现编译器工具链中的词法解析工具 Flex

我们在上一节以手动的方式实现了一个词法解析器的 c 语言源码。它主要包含若干部分&#xff0c;第一部分就是输入缓存系统&#xff0c;用于从磁盘文件或者控制台上获取要解析的字符串。第二部分是数据读入逻辑&#xff0c;它主要通过调用输入系统的接口获得要解析的字符串&…

1 Supervised Machine Learning Regression and Classification

文章目录 Week1OverViewSupervised LearningUnsupervised LearningLinear Regression ModelCost functionGradient Descent Week2Muliple FeatureVectorizationGradient Descent for Multiple RegressionFeature ScalingGradient DescentFeature EngineeringPolynomial Regress…

企业动产抵押代表着什么?

动产抵押 动产抵押是指债务人或第三人以动产不移转占有而供担保的抵押形式。在债务人不履行债务时&#xff0c;抵押权人占有抵押动产&#xff0c;并就其出卖价金优先于其他债权而受清偿。由于不移转动产的占有而与以动产为标的的质权相区别&#xff0c;因动产抵押为不占有债务…

python socket编程2 - socket创建发送方所需参数的获得

使用socket进行进程间通信或者跨网络的计算机间通讯&#xff0c;有点类似日常生活中的发送快递。 根据发送方的需要&#xff0c;选择不同的物流公司&#xff1a; 在选择适合的公司和运输方式后&#xff0c;需要在app上做出选择&#xff0c;并根据要求填写一些信息。app会根据…

YOLO目标检测——树叶检测数据集下载分享【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;生物多样性研究、林业管理、环境监测和教育科研等方面数据集说明&#xff1a;树叶分类检测数据&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富&#xff0c;总共十个类别。标签说明&#xff1a;使用lableimg标注软件标注&#xff0c;标…

【echarts】实现单线与多线滚轮联动、隐藏拖拽、关闭动画

单线滚轮联动 <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>ECharts DataZoom</title><script src"https://cdn.jsdelivr.net/npm/echarts5.2.0/dist/echarts.min.js"></script> </hea…

it is missing from your system. Install or enable PHP‘s sodium extension.

Composer with –ignore-platform-reqext-sodium it is missing from your system. Install or enable PHP’s sodium extension. 出现如上的报错是的 开启php.ini中的 sodium的扩展

CSS英文单词强制截断换行

效果图&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>菜鸟教程(runoob.com)</title> <style> p.test1 {width:9em; border:1px solid #000000;word-break:keep-all; }p.…

电视盒子哪个牌子好?资深小编种草超值网络电视盒子推荐

智能电视出现后电视盒子并没有被淘汰&#xff0c;是因为它可以让配置落后的智能电视升级换代、更换全新的系统&#xff0c;小编这几年体验过数十款电视盒子了&#xff0c;鉴于很多朋友在问电视盒子哪个牌子好&#xff0c;我盘点了五款最值得入手的网络电视盒子推荐给各位。 第一…