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

news2024/11/27 14:48:20
定义于头文件 <algorithm>

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

返回各给定值中的较小者

std::min

template< class T >
const T& min( const T& a, const T& b );

(1)(C++14 前)

template< class T >
constexpr const T& min( const T& a, const T& b );

(C++14 起)

template< class T, class Compare >
const T& min( const T& a, const T& b, Compare comp );

(2)(C++14 前)

template< class T, class Compare >
constexpr const T& min( const T& a, const T& b, Compare comp );

(C++14 起)

template< class T >
T min( std::initializer_list<T> ilist );

(3)(C++11 起)
(C++14 前)

template< class T >
constexpr T min( std::initializer_list<T> ilist );

(C++14 起)

template< class T, class Compare >
T min( std::initializer_list<T> ilist, Compare comp );

(4)(C++11 起)
(C++14 前)

template< class T, class Compare >
constexpr T min( std::initializer_list<T> ilist, Compare comp );

(C++14 起)

返回给定值中的较小者。

1-2) 返回 ab 的较小者。

3-4) 返回 initializer_list ilist 中值的最小者。

(1,3) 版本用 operator< 比较元素, (2,4) 版本用给定的比较函数 comp

参数

a, b-要比较的值
ilist-拥有要比较的值的 initializer_list
cmp-比较函数对象(即满足比较 (Compare) 要求的对象),若 a 小于 b ,则返回 ​true 。

比较函数的签名应等价于如下:

 bool cmp(const Type1 &a, const Type2 &b);

虽然签名不必有 const & ,函数也不能修改传递给它的对象,而且必须接受(可为 const 的)类型 Type1Type2 的值,无关乎值类别(从而不允许 Type1 & ,亦不允许 Type1 ,除非 Type1 的移动等价于复制 (C++11 起))。
类型 Type1 与 Type2 必须使得 T 类型的对象能隐式转换到这两个类型。 ​

类型要求
- 为使用重载 (1,3) , T 必须满足可小于比较 (LessThanComparable) 的要求。
- 为使用重载 (3,4) , T 必须满足可复制构造 (CopyConstructible) 的要求。

返回值

1-2) ab 的较小者。若值等价,则返回 a

3-4) ilist 中的最小值。若有数个等价于最小者的值,则返回最左侧的这种值。

复杂度

1-2) 准确一次比较

3-4) 准确 ilist.size() - 1 次比较

 

可能的实现

版本一

template<class T> 
const T& min(const T& a, const T& b)
{
    return (b < a) ? b : a;
}

版本二

template<class T, class Compare> 
const T& min(const T& a, const T& b, Compare comp)
{
    return (comp(b, a)) ? b : a;
}

版本三

template<class T>
T min( std::initializer_list<T> ilist)
{
    return *std::min_element(ilist.begin(), ilist.end());
}

版本四

template<class T, class Compare>
T min(std::initializer_list<T> ilist, Compare comp)
{
    return *std::min_element(ilist.begin(), ilist.end(), comp);
}

警告

若参数之一是右值,且返回该参数,则以引用捕获 std::min 的结果会产生一个悬垂引用:

int n = 1;
const int& r = std::min(n-1, n+1);
// r 为悬垂

调用示例

#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;

    // 获取队列中最大都元素
    Cell tCell{999, 999};
    for (const Cell &cell : cells1)
    {
        tCell = std::min(tCell, cell);
        std::cout << tCell << " ";
    }

    std::cout << std::endl;
    std::cout << std::endl;
    std::cout << "min:      " << tCell << 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;

    // 获取队列中最大都元素
    Cell tCell2 {999, 999};
    for (const Cell &cell : cells2)
    {
        tCell2 = std::min(tCell2, cell, larger);
        std::cout << tCell << " ";
    }

    std::cout << std::endl;
    std::cout << std::endl;
    std::cout << "min:      " << tCell2 << std::endl;
    std::cout << std::endl;

    //返回 initializer_list ilist 中值的最大者。
    Cell tCell3 = std::min({Cell{1, 2}, Cell{3, 4}, Cell{5, 6}, Cell{7, 8}});
    std::cout << "initializer_list min:      " << tCell3 << std::endl;
    std::cout << std::endl;

    Cell tCell4 = std::min({Cell{1, 2}, Cell{3, 4}, Cell{5, 6}, Cell{7, 8}}, larger);
    std::cout << "initializer_list min:      " << tCell4 << std::endl;
    std::cout << std::endl;

    return 0;
}

输出

 

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

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

相关文章

基于Java实现(PC)职员工作量管理系统【100010042】

工作量统计系统 一、概述 ​ 在本次专业课实践中我选取到的题目为员工工作量统计系统。该系统分为三个模块&#xff0c;一是实现员工的登录&#xff0c;二是进入到员工的个人界面&#xff0c;并显示&#xff0c;输出员工的个人信息&#xff0c;同时还可以进行输入。第三个模块…

div对角线来回浮动显示

animation-timing-function linear 动画从头到尾的速度是相同的。 ease 默认。动画以低速开始&#xff0c;然后加快&#xff0c;在结束前变慢 ease-in 动画以低速开始 ease-out 动画以低速结束 ease-in-out 动画以低速开始和结束 steps(int,start|end) 指定了时间函数中的间隔…

公司对外投资和担保

一、公司对外投资和担保规范 公司对外投资和外他人提供担保&#xff0c;需承担相应的责任 公司可以对外投资和提供担保 二、公司提供担保的方式 保证 抵押 质押 三、公司提供担保的规定 公司对外承担的规定 公司向其他企业投资或者为他人提供担保&#xff0c;依照公司章程的规…

seata-server-1.4.2的环境搭建

修改seata-server-1.4.2/conf目录下的file.conf和registry.conf file.conf 将store下mode修改为db&#xff0c;找到db模块修改 driverClassName、url、user、password mysql 5.使用 driverClassName "com.mysql.jdbc.Driver" mysql 8 使用 driverClassName "…

Docker入门之docker-compose

一&#xff0c;Docker-compose简介 1&#xff0c;Docker-compose简介 Docker-Compose项目是Docker官方的开源项目&#xff0c;负责实现对Docker容器集群的快速编排。 Docker-Compose将所管理的容器分为三层&#xff0c;分别是工程&#xff08;project&#xff09;&#xff0c…

【MATLAB教程案例62】使用matlab实现基于PointNet++网络的点云数据分类仿真分析

欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程》 目录 1.软件版本 2.PointNet++网络理论概述

通过java代码实现ES中的常用搜索

目录 测试环境准备 在指定索引下搜索全部&#xff08;可以指定字段&#xff09; 通过ids进行搜索 对搜索结果进行分页 match分词搜索 不分词模糊搜索&#xff1a;wildcardQuery与matchPhraseQuery term 搜索&#xff08;精确匹配&#xff09; multi_match搜索 bool搜索…

23年如何准备考PMP?这4点建议你得看

23年的PMP考试还有3个多月&#xff0c;现在开始备考&#xff0c;再合适不过&#xff0c;我这里提出四点备考建议&#xff0c;希望能帮到备考的大家&#xff1a; 【《PMBOK指南》】 PMP的教材仍是第六版&#xff0c;如果有第七版就看第七版&#xff0c;纸质或者电子版都可以&am…

【基础强训】day1

一、选择题&#xff1a; 1. 以下for循环的执行次数是&#xff08;&#xff09; for(int x 0, y 0; (y 123) && (x < 4); x); A 是无限循环 B 循环次数不定 C 4次 D 3次 C y123为真&#xff0c;所以就循环四次。 2. 以下程序的运行结果是&#xff08;&#xff…

jsp+ssm计算机毕业设计ssm酒店综合管理平台【附源码】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JSPSSM mybatis Maven等等组成&#xff0c;B/S模式 Mave…

2D激光雷达:使用MindStudio进行MindX SDK任务开发

任务介绍 该项目基于DROW3和DR-SPAAM模型&#xff0c;实现了实时的2D激光雷达行人检测。 主要处理流程为&#xff1a;输入预处理后的激光雷达点云序列&#xff08;帧&#xff09;->行人检测模型推理->行人检测模型后处理->检测结果输出及可视化。 由于二维距离数据信…

Unity Gradient Lerp 颜色渐变

最近改插件&#xff0c;本来如果有Gradient的lerp方法&#xff0c;改起来会非常方便。因为插件的更改入口是这个Gradient。运行时候手动调节inspector面板可以直接更改效果。那么此时只要在代码中更改Gradient即可。 但是找了几遍Color&#xff0c;ColorUtility&#xff0c;Gr…

怎么去图片水印?三招让你快速学会图片去水印

上大学的时候&#xff0c;老师让我们每人写一个关于“阅读”的主题报告。写这个主题报告的时候&#xff0c;我发现在网上找的图片素材大多带有水印&#xff0c;十分影响报告的展示效果。于是&#xff0c;我就上网找了一些怎么去图片水印的方法&#xff0c;对这些方法进行试验后…

Redis持久化(RDBAOF)

持久化简介&#xff1a; 不知道大家有没有遇见过&#xff0c;就是正工作的时候停电了&#xff0c;如果你用的是笔记本电脑还好&#xff0c;你有电池&#xff0c;但如果你用的是台式机呢&#xff0c;那恐怕就比较灾难了&#xff0c;假如你现在正在写一个比较重要的文档&#xf…

Java集合——Map

Map集合 Map用于保存具有映射关系的数据&#xff0c;以键值对的形式存储&#xff0c;支持通过key来访问value&#xff0c;因此key不能重复。 Map接口下主要有Hashtable、HashMap、LinkedHashMap、ConcurrentHashMap 四个主要的实现类&#xff0c;实现的基本原理类似&#xff0…

【图像处理】Hough变换检测直线与圆的原理

霍夫变换的基本原理 霍夫变换(Hough Transform)可以理解为图像处理中的一种特征提取技术&#xff0c;通过投票算法检测具有特定形状的物体。霍夫变换运用两个坐标空间之间的变换将在一个空间中具有相同形状的曲线或直线映射到另一个坐标空间中的一个点形成峰值&#xff0c;从而…

菜菜学paddle第七篇:目标检测的基本概念

一、什么是目标检测&#xff1f; 在前面的几篇中&#xff0c;我们学习了使用卷积神经网络进行图像分类&#xff0c;比如手写数字识别是用来识别0~9这十个数字。与图像分类处理单个物体的识别不同&#xff0c;目标检测它识别的不仅是物体&#xff0c;还是多个物体&#xff0c;…

[附源码]Python计算机毕业设计高校教务管理系统Django(程序+LW)

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

Spring之IOC

IoC&#xff08;Inverse of Control:控制反转&#xff09;是一种设计思想&#xff0c;就是 将原本在程序中手动创建对象的控制权&#xff0c;交由Spring框架来管理。 IoC 在其他语言中也有应用&#xff0c;并非 Spirng 特有。 IoC 容器是 Spring 用来实现 IoC 的载体&#xff0…

服务攻防-应用协议RsyncSSHRDPFTP漏洞批扫口令猜解

目录 测试思路 &#xff08;一&#xff09;口令猜解——SSH&RDP&FTP Demo: &#xff08;二&#xff09;配置不当-未授权访问-Rsync 文件备份 尝试读取src文件 &#xff08;三&#xff09;协议漏洞-应用软件-FTP&Proftpd 搭建 &#xff08;四&#xff09;协议漏…