C++11标准模板(STL)- 算法(std::max_element)

news2024/11/30 14:38:41
定义于头文件 <algorithm>

算法库提供大量用途的函数(例如查找、排序、计数、操作),它们在元素范围上操作。注意范围定义为 [first, last) ,其中 last 指代要查询或修改的最后元素的后一个元素。

返回范围内的最大元素

std::max_element

template< class ForwardIt >
ForwardIt max_element(ForwardIt first, ForwardIt last );

(1)(C++17 前)

template< class ForwardIt >
constexpr ForwardIt max_element(ForwardIt first, ForwardIt last );

(C++17 起)

template< class ExecutionPolicy, class ForwardIt >
ForwardIt max_element(ExecutionPolicy&& policy, ForwardIt first, ForwardIt last );

(2)(C++17 起)

template< class ForwardIt, class Compare >
ForwardIt max_element(ForwardIt first, ForwardIt last, Compare comp );

(3)(C++17 前)

template< class ForwardIt, class Compare >
constexpr ForwardIt max_element(ForwardIt first, ForwardIt last, Compare comp );

(C++17 起)

template< class ExecutionPolicy, class ForwardIt, class Compare >
ForwardIt max_element(ExecutionPolicy&& policy, ForwardIt first, ForwardIt last, Compare comp );

(4)(C++17 起)

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

1) 用 operator< 比较元素。

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

2,4) 同 (1,3) ,但按照 policy 执行。这些重载仅若 std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> 为 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 <iostream>
#include <algorithm>
#include <functional>
#include <vector>
#include <iterator>
#include <time.h>

using namespace std;

struct Cell
{
    int x;
    int y;

    Cell &operator +=(const Cell &cell)
    {
        x += cell.x;
        y += cell.y;
        return *this;
    }

    bool operator <(const Cell &cell) const
    {
        if (x == cell.x)
        {
            return y < cell.y;
        }
        else
        {
            return x < cell.x;
        }
    }
};

std::ostream &operator<<(std::ostream &os, const Cell &cell)
{
    os << "{" << cell.x << "," << cell.y << "}";
    return os;
}

int main()
{
    srand((unsigned)time(NULL));;

    std::cout << std::boolalpha;

    auto func1 = []()
    {
        int n = std::rand() % 10 + 100;
        Cell cell{n, n};
        return cell;
    };

    // 初始化cells1
    vector<Cell> cells1(6);
    std::generate(cells1.begin(), cells1.end(), func1);

    // 打印cells1
    std::copy(cells1.begin(), cells1.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;
    std::cout << std::endl;

    // 获取队列中最大都元素
    std::vector<Cell>::iterator result1;
    result1 = std::max_element(cells1.begin(), cells1.end());

    std::cout << "max element at:       " << std::distance(cells1.begin(), result1) << '\n';
    std::cout << "max_element cells1:   " << *result1 << std::endl;
    std::cout << std::endl;
    std::cout << std::endl;

    auto larger = [](const Cell & a, const Cell & b)
    {
        if (a.x == b.x)
        {
            return a.y < b.y;
        }
        else
        {
            return a.x < b.x;
        }
    };

    // 初始化cells2
    vector<Cell> cells2(6);
    std::generate(cells2.begin(), cells2.end(), func1);

    // 打印cells2
    std::copy(cells2.begin(), cells2.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;
    std::cout << std::endl;

    // 获取队列中最大都元素
    std::vector<Cell>::iterator result2;
    result2 = std::max_element(cells2.begin(), cells2.end(), larger);

    std::cout << "max element at:       " << std::distance(cells2.begin(), result2) << '\n';
    std::cout << "max_element cells2:   " << *result2 << std::endl;
    std::cout << std::endl;
    std::cout << std::endl;

    return 0;
}

输出

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2022 12月15日 每日面试题(MyBatis)

&#x1f3e0;个人主页&#xff1a;不会写代码的满满 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是满满&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; 目前状况&#x1f389;&#xff1a;开学即将大三&#xff0c;目标就是半年内找到一份实…

【云计算与大数据技术】资源管理、调度模型策略的讲解

一、资源管理模型 集群资源管理模型通常由两个部分组成&#xff0c;即资源表示模型和资源分配模型&#xff0c;由于这两个部分是耦合的&#xff0c;所有优化集群资源管理时需要同时结合这两个部分考虑&#xff0c;资源表示模型用于描述集群资源的组织方式&#xff0c;是集群资…

【Contrastive Learning:IVIF】

CLF-Net: Contrastive Learning for Infrared and Visible Image Fusion Network &#xff08;LF-Net&#xff1a;红外与可见光图像融合网络的对比学习&#xff09; &#xff08;总结&#xff1a;就是更像谁就选谁&#xff09; 本文提出了一种基于对比学习的红外和可见光图像融…

透过ChatGPT的进化足迹,OpenAI传达了哪些信号?

古希腊神话中&#xff0c;一位名叫赫尔墨斯的神&#xff0c;会充当人神之间的信使&#xff0c;穿着带有双翼的飞鞋&#xff0c;行走在神明与人类之间。根据《荷马史诗》的记载&#xff1a;“在天神中&#xff0c;赫尔墨斯是最喜欢引导凡人前行的。”这句话用来形容OpenAI与AI的…

佳力奇IPO过会:拟募资11亿 西安现代与华控湖北是股东

雷递网 雷建平 12月13日安徽佳力奇先进复合材料科技股份公司&#xff08;简称&#xff1a;“佳力奇”&#xff09;日前IPO过会&#xff0c;准备在深交所创业板上市。佳力奇计划募资11.22亿元&#xff0c;其中&#xff0c;6.2亿元用于先进复合材料数智化生产基地建设项目&#x…

Google Cloud database options (关于GCP数据库怎么选择)

背景 GCP提供了几种您可以从中选择的数据库服务&#xff0c;可是究竟该用哪个呢&#xff1f; Cloud SQL:Cloud Spanner:BigQuery:Cloud Bigtable:Cloud Firestore:Firebase Realtime Database:Cloud Memorystore: from Google Cloud database options sort out by zhengkai.…

【自然语言处理】隐马尔科夫模型【Ⅱ】隐马尔科夫模型概述

有任何的书写错误、排版错误、概念错误等&#xff0c;希望大家包含指正。 由于字数限制&#xff0c;分成六篇博客。 【自然语言处理】隐马尔可夫模型【Ⅰ】马尔可夫模型 【自然语言处理】隐马尔科夫模型【Ⅱ】隐马尔科夫模型概述 【自然语言处理】隐马尔科夫模型【Ⅲ】估计问题…

14、TheFatRat木马生成工具-创建后门或payload

kail攻击主机&#xff1a; Kali 192.168.11.106靶机&#xff1a;windows server 2008 r2 192.168.11.134 x64 32位一、TheFatRat介绍 TheFatRat创建的后门或者payload&#xff0c;可以在Linux&#xff0c;Windows&#xff0c;Mac和Android上等多种平台上执行&#xff0c;可生…

九、JavaScript——数据类型_数值

一、数值 定义及规范&#xff1a; 数值 &#xff08;Number) -在JS中所有的整数和浮点数(小数) 都是Number JS中的数值并不是无限大的&#xff0c;当数值超过一定后会显示近似值&#xff0c;JavaScript表达的最大整数是&#xff1a;9007199254740992 Infinity 是…

设计模式总览——枯燥的知识又增加了

从今天开始呢&#xff0c;阿Q就带大家了解一下 java 的设计模式&#xff0c;并从中选出比较常用的几种设计模式进行总结。首先呢&#xff0c;先给大家说一下设计模式到底是什么。 设计模式 设计模式&#xff08;Design pattern&#xff09;代表了最佳的实践&#xff0c;通常被…

iOS备用机自动充电方案

搬到新加坡以后&#xff0c;我拥有了很多张手机卡&#xff1a;1张国内的电话卡&#xff0c;回国时使用1张新加坡电话卡&#xff0c;本地使用1张马来西亚电话卡&#xff0c;去马来西亚旅行时使用1张英国电话卡&#xff0c;去欧洲旅行时使用相对应的&#xff0c;我需要有备用机来…

DSP篇--C6701功能调试系列之 FLASH测试

目录 1、 FLASH介绍 2、 FLASH功能测试 调试的前期准备可以参考前面的博文&#xff1a;DSP篇--C6701功能调试系列之前期准备_nanke_yh的博客-CSDN博客 1、 FLASH介绍 FLASH作为EMIF的外设&#xff0c;对其操作就需要根据EMIF相关配置来确定FLASH的地址了。 一般地&#xff…

Django第二天学习记录

1.对于路由配置的正则化补充(re_path的正则匹配) 对于第一天学习的path转换器过于暴力&#xff0c;对于需要匹配的内容不能很精准的进行转换。为了实现精准的字符串匹配规则&#xff0c;因此引入了re_path&#xff08;reg,view,namexxx&#xff09;进行路由规则的精确匹配。 正…

关于云计算的 7 大误区

一直以来&#xff0c;有几个关于云计算的误区四处传播&#xff0c;散布恐惧和不必要的不信任。在使用新技术之前研究新技术并检查事实是很好的。让我们来看看关于云计算的 7 大误区&#xff0c;看看哪些是真的&#xff0c;哪些不是。 1.云迁移可能很麻烦 云迁移包括许多过程&am…

KMP算法讲解与实现

0、概述 KMP是用于字符串查找/匹配的算法&#xff1b; KMP算法的时间复杂度&#xff1a;O(n)O(n)O(n)&#xff1b; KMP算法的核心&#xff1a; 1&#xff09;如何理解 next 数组2&#xff09;如何利用 next 数组加速匹配过程&#xff0c;优化时的两个实质 KMP算法的实现 1…

推荐|资深架构师 10 年 10 条干货职场心得

出道这么些年&#xff0c;跳过好多公司&#xff0c;除了国企其他的基本上都去过&#xff0c;甲方、乙方、外包、外企、互联网公司、创业公司…总结下来有这么些体会&#xff0c;希望能对你和大家有些参考价值。1. 保持学习可能离开了学校之后&#xff0c;所有的学习几乎都出于工…

b站黑马的Vue快速入门案例代码——图片切换(类似手动播放的轮播图)

目录 目标效果&#xff1a; 重点原理&#xff1a; 1.用数组储存图片的数据 2.v-bind指令可以设置元素属性 e.g.src 语法 v-bind:属性名表达式 简写【实际开发常用】 :属性名表达式 3.v-show和v-if都可以切换元素的显示/隐藏状态 (1)频繁切换显示/隐藏的dom元素用 v…

Opencv项目实战:17 贪吃蛇游戏

目录 0、项目介绍 1、效果展示 2、项目搭建 3、项目代码展示与讲解 4、项目资源 5、项目总结 0、项目介绍 这次是一个有意思的计算机视觉游戏——贪吃蛇&#xff0c;我们以食指为蛇头&#xff0c;不断的移动我们的手指&#xff0c;当吃到甜甜圈的时候&#xff0c;蛇身增…

浅谈字节码增强技术系列2-Asm与Cglib

作者&#xff1a;董子龙 前言 记得那是2022年秋天的第一场雨&#xff0c;比2021年来的稍晚一些&#xff0c;在那个秋雨朦胧的下午&#xff0c;正在工位上奋笔疾书的我突然听到了前面波哥对着手机听筒说出来的"温柔"的话语&#xff1a;说说你了解的spring-aop。话音…

基于Vision Transformers的文档理解简介

文档理解是从pdf、图像和Word文档中提取关键信息的技术。这篇文章的目标是提供一个文档理解模型的概述。 文档理解算法使用编码器-解码器结构分析文档内容&#xff0c;该管道结合了计算机视觉(CV)和自然语言处理(NLP)方法。管道的CV部分将文档作为输入图像进行分析&#xff0c…