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

news2025/1/16 21:11:58
定义于头文件 <algorithm>

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

返回范围内的最小元素

std::min_element

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

(1)(C++17 前)

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

(C++17 起)
template< class ExecutionPolicy, class ForwardIt >

ForwardIt min_element( ExecutionPolicy&& policy,

                       ForwardIt first, ForwardIt last );
(2)(C++17 起)

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

(3)(C++17 前)

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

(C++17 起)
template< class ExecutionPolicy, class ForwardIt, class Compare >

ForwardIt min_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) 要求的对象),若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 <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::min_element(cells1.begin(), cells1.end());

    std::cout << "min element at:       " << std::distance(cells1.begin(), result1) << '\n';
    std::cout << "min_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::min_element(cells2.begin(), cells2.end(), larger);

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

    return 0;
}

输出

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

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

相关文章

[附源码]Python计算机毕业设计个人资金账户管理Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

PMP考试有用吗?

有用&#xff0c;对于项目管理岗位来说&#xff0c;PMP 就是一个最基础的必备的证书&#xff0c;你说含金量有多高不见得&#xff0c;但是没有这个证书找工作可能会受阻。 下面这两种情况对 PMP 的需求是硬性要求&#xff0c;很现实&#xff0c;有证才能获得资格&#xff0c;没…

图算法在风控场景的应用

​导读&#xff1a;本文将分享图算法在风控中的应用。 今天的介绍会围绕下面四点展开&#xff1a; 图算法和风控简介 图算法在风控的演化 相应平台的心得 展望未来 分享嘉宾&#xff5c;汪浩然 互联网行业资深风控和图计算专家 编辑整理&#xff5c;戴杰 永辉超市 出品社…

Mybatis学习笔记

1.Mybatis是什么 MyBatis 是一款优秀的持久层框架&#xff0c;它支持定制化SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC代码和手动设置参数以及获取结果集&#xff0c; 它可以使用简单的XML或注解来配置和映射SQL信息&#xff0c;将接口和 Java 的 POJOs(Plain …

Docker入门(基础篇)

Docker入门Docker相关概念为什么需要DockerDocker的理念容器与虚拟机的比较Docker的安装与使用安装Dockerdocker 的三要素Docker常用命令Docker相关概念 为什么需要Docker 为什么会出现Docker了&#xff1f;现在我们假设你在开发一个项目&#xff0c;你使用的是一台笔记本电脑…

前端显示分页详解(一)

我们在浏览页面的时候&#xff0c;是不是经常看到网页经常是以页面的形式给我们展现出来的&#xff0c;我们以淘宝的页面为例&#xff08;如下图&#xff09;&#xff0c;那这样按照页面呈现有什么好处呢&#xff1f;这篇文章让我们来深入探究了解这其中的奥秘。 优点&#xff…

分享10个比B站更刺激的网站,千万别轻易点开

作为一个码龄8年程序员&#xff0c;到现在还能保持着浓密的头发和健壮的身体&#xff0c;全靠这10个网站让我健&#xff08;偷&#xff09;康&#xff08;偷&#xff09;生&#xff08;摸&#xff09;活&#xff08;鱼&#xff09;&#xff0c;今天就把我收藏夹里的网站无私分享…

@Windows server 2022 搭建 AD 域服务器

文章目录1.AD(Active Directory)Windows Server环境准备2.配置AD环境3.添加角色和功能4.配置域控服务器5.配置 AD 域 OU 和用户6.Client计算机加入域控管理7.使用AD账号测试登录客户端1.AD(Active Directory)Windows Server环境准备 主机名称IP角色AD_Server192.168.1.221AD服…

Omnet+Sumo+Veins安装配置总结(Windows 10按照配置成功)

** 写在前面 ** 博主是一枚车联网小白&#xff0c;该博客只是完整记录了博主安装配置&#xff08;Veins 4.7.1SUMO 0.30.0OMNeT 5.4.1&#xff09;环境的过程&#xff0c;电脑是win10操作系统&#xff0c;期间主要参考官网给的教程和网上其他大佬的文档。 第一步&#xff1a…

数图互通高校房产管理——货币化补贴管理

数图互通房产管理系统在这方面做得比较全面&#xff1b; 1、货币化补贴 住房补贴主要分为按月补贴、一次性补贴、差额补贴、级差补贴和职务职称变动补贴&#xff0c;系统可自动计算补发金额及之后每月的应发补贴金额。系统可导出学校每月的住房补贴发放明细表&#xff0c;可以…

毕业设计-基于大数据的移动图书馆个性化推荐系统-python

目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科…

算法为何重要(《数据结构与算法图解》by 杰伊•温格罗)

本文内容借鉴一本我非常喜欢的书——《数据结构与算法图解》。学习之余&#xff0c;我决定把这本书精彩的部分摘录出来与大家分享。 写在前面 算法这个词听起来很深奥&#xff0c;其实不然。它只是解决某个问题的一套流程。 准备一碗麦片的流程也可以说是一种算法&#xff0…

谷歌将于2023年初在Android 13上推出隐私沙盒测试版

©网络研究院 互联网巨头谷歌表示&#xff0c;计划从明年年初开始&#xff0c;在运行Android 13的移动设备上推出安卓隐私沙盒测试版。 该公司表示:“隐私沙盒测试版将面向希望测试广告相关API作为其解决方案一部分的广告技术和应用开发者开放。” 为此&#xff0c;开发者…

解密 MySQL 的主备一致

MySQL 实现主备一致肯定是 binlog。毫不夸张的说&#xff0c;MySQL 能够成为现在最流行的开源数据库&#xff0c;binlog 功不可没。 MySQL主备的基本原理 ​ 主备流程图备库 B 跟主库 A 之间维持了一个长连接。主库 A 内部有一个线程&#xff0c;专门用于服务备库 B 的这个长…

漏洞深度分析|Pgadmin 命令执行漏洞

项目介绍 PostgreSQL是世界上第四大流行的开源数据库管理系统&#xff0c;它在各种规模的应用程序中得到了广泛的使用。而管理数据库的传统方法是使用命令行界面(CLI)工具。 PostgreSQL的图形化用户界面(GUI)工具则可以帮助用户对数据库实现更好的管理、操纵、以及可视化其数…

这些方法助你打好年终收官战

一、减少推文中的链接数量 研究表明&#xff0c;没有链接的推文更容易产生粉丝互动。所以你不必在每条推文中都包含链接。链接的精妙在于精而不在于杂。所以如果你限制包含链接的推文数量&#xff0c;你会发现你推文的粉丝参与度会增加。 少量的链接更有利于和粉丝建立信任&a…

【从零开始学习深度学习】27.卷积神经网络之VGG11模型介绍及其Pytorch实现【含完整代码】

目录1. VGG块介绍2. 构造VGG网络模型3. 获取Fashion-MNIST数据并用VGG-11训练模型4.总结AlexNet在LeNet的基础上增加了3个卷积层。但AlexNet对卷积窗口、输出通道数和构造顺序均做了大量的调整。虽然AlexNet模型表明深度卷积神经网络可以取得出色的结果&#xff0c;但并没有提供…

C++ Reference: Standard C++ Library reference: Containers: map: map: emplace

C官网参考链接&#xff1a;https://cplusplus.com/reference/map/map/emplace/ 公有成员函数 <map> std::map::emplace template <class... Args> pair<iterator,bool> emplace (Args&&... args);构造并插入元素 如果元素的键是唯一的&#xff0c;…

【沙拉查词】沙拉查词配置教程——如何实现截图OCR翻译、截图翻译?

一、问题背景 2022年12月16日&#xff0c;沙拉查词仍然没有截图翻译的功能。 这个功能&#xff0c;在百度翻译上虽然能够实现&#xff0c;但是要额外下一个软件和挂在后台&#xff0c;总是觉得麻烦。 二、解决方法 如果你是一个quicker软件使用者&#xff0c;那么通过添加「…

python中的字典详解

目录 一.思考 二.字典定义 注意 三.字典数据的获取 注意 字典的嵌套 四.字典常用操作 1.新增、更新元素 2.删除元素 3.清空字典 4.获取全部Key 5.利用Key遍历字典 五.字典总结 六.字典实例 一.思考 为什么需要字典? 生活中的字典我们可以根据【字】来找到对应的【含…