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

news2024/12/24 9:49:07
定义于头文件 <algorithm>

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

返回两个元素的较小和较大者

std::minmax

template< class T >
std::pair<const T&,const T&> minmax( const T& a, const T& b );

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

template< class T >
constexpr std::pair<const T&,const T&> minmax( const T& a, const T& b );

(C++14 起)
template< class T, class Compare >

std::pair<const T&,const T&> minmax( const T& a, const T& b,

                                     Compare comp );
(2)(C++11 起)
(C++14 前)
template< class T, class Compare >

constexpr std::pair<const T&,const T&> minmax( const T& a, const T& b,

                                               Compare comp );
(C++14 起)

template< class T >
std::pair<T,T> minmax( std::initializer_list<T> ilist);

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

template< class T >
constexpr std::pair<T,T> minmax( std::initializer_list<T> ilist);

(C++14 起)

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

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

template< class T, class Compare >
constexpr std::pair<T,T> minmax( 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
comp-比较函数对象(即满足比较 (Compare) 要求的对象),若首个参数小于第二个,则返回 ​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) 若 a<b 或若 a 等价于 b 则返回 std::pair<const T&, const T&>(a, b) 的结果。若 b<a 则返回 std::pair<const T&, const T&>(b, a) 的结果。

3-4) 以 ilist 中最小元素为第一元素,最大元素为第二元素的 pair 。若有数个元素等价于最小者,则返回最左的这种元素。若有数个元素等价于最大者,则返回最右的这种元素。

复杂度

1-2) 准确一次比较

3-4) 至多 ilist.size() * 3 / 2 次比较

 

可能的实现

版本一

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

版本二

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

版本三

template< class T >
std::pair<T, T> minmax( std::initializer_list<T> ilist )
{
    auto p = std::minmax_element(ilist.begin(), ilist.end());
    return std::make_pair(*p.first, *p.second);
}

版本四

template< class T, class Compare >
std::pair<T, T> minmax( std::initializer_list<T> ilist, Compare comp )
{
    auto p = std::minmax_element(ilist.begin(), ilist.end(), comp);
    return std::make_pair(*p.first, *p.second);
}

注意

对于重载 (1,2) ,若参数之一为右值,则返回的引用在包含对 minmax 调用的完整表达式结尾变为悬垂引用:

int n = 1;
auto p = std::minmax(n, n+1);
int m = p.first; // ok
int x = p.second; // 未定义行为

调用示例

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

    Cell cell_1 = func1();
    std::cout << "cell_1:       " << cell_1 << std::endl;
    Cell cell_2 = func1();
    std::cout << "cell_2:       " << cell_2 << std::endl;

    std::pair<const Cell, const Cell> bounds = std::minmax(cell_1, cell_2);
    std::cout << "min:          " << bounds.first  << std::endl;
    std::cout << "max:          " << bounds.second << 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;
        }
    };

    Cell cell_3 = func1();
    std::cout << "cell_3:       " << cell_3 << std::endl;
    Cell cell_4 = func1();
    std::cout << "cell_4:       " << cell_4 << std::endl;

    std::pair<const Cell, const Cell> bounds2 = std::minmax(cell_3, cell_4, larger);
    std::cout << "min:          " << bounds2.first  << std::endl;
    std::cout << "max:          " << bounds2.second << std::endl;

    std::cout << std::endl;

    std::pair<const Cell, const Cell> bounds3 = std::minmax({Cell{1, 2}, Cell{3, 4}, Cell{5, 6}, Cell{7, 8}});
    std::cout << "min:          " << bounds3.first  << std::endl;
    std::cout << "max:          " << bounds3.second << std::endl;

    std::cout << std::endl;

    std::pair<const Cell, const Cell> bounds4 = std::minmax({Cell{1, 2}, Cell{3, 4}, Cell{5, 6}, Cell{7, 8}}, larger);
    std::cout << "min:          " << bounds4.first  << std::endl;
    std::cout << "max:          " << bounds4.second << std::endl;

    return 0;
}

输出

 

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

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

相关文章

二次供水智慧改造,保障冬季热水稳定供给

冬季低温雨雪天气不仅仅影响到居民用水&#xff0c;也影响到二次供水泵站的维护检修。一旦设备出现故障&#xff0c;导致无法及时供水&#xff0c;居民可能喝不上一口热水&#xff0c;更不用提热水洗澡的难题了。因此&#xff0c;在冬季需要对二次供水泵站设备更加关注&#xf…

AD20和立创EDA设计(4)PCB设计

&#xff08;1&#xff09;本文主要介绍如何将从立创EDA导出的原理图&#xff0c;在AD20进行PCB设计。 &#xff08;2&#xff09;需提前观看&#xff1a;AD20和立创EDA设计&#xff08;3&#xff09;微调原理图和原理图检查&#xff1b; &#xff08;3&#xff09;邀请加入嵌入…

【数据结构Note6】-图-知识总结(图存储+BFS+DFS+最小生成树+最短路径+拓扑+逆拓扑)

文章目录6.1 图的定义及性质6.1.1 无向图和有向图6.1.2 简单图和多重图6.1.3 图的相关概念6.1.3.1 顶点的度6.1.3.2 顶点和顶点的关系6.1.3.3 子图6.1.3.4 连通分量6.1.3.5 强连通分量6.1.3.6 生成树6.1.3.7 生成森林6.1.3.8 边的权、带权图/网6.1.3.9 几种特殊的图6.2 图的存储…

课程试题库网站

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 模块划分&#xff1a;老师模块、班级模块、学生模块、课程模块、试题模块、试卷模块、组卷模块、考试模块、答题模) 管理…

零基础转行Python开发怎么学习呢?

转行零基础学Python编程开发难度大吗&#xff1f;从哪学起&#xff1f;近期很多小伙伴问我&#xff0c;如果自己转行学习Python&#xff0c;完全0基础能否学会呢&#xff1f;Python的难度到底有多大&#xff1f;今天&#xff0c;小编就来为大家详细解读一下这个问题。 学习 Py…

时间哈希+日期处理 睡大觉

E-睡大觉_2022河南萌新联赛第&#xff08;四&#xff09;场&#xff1a;郑州轻工业大学 (nowcoder.com) 题意&#xff1a; 思路&#xff1a; 这是一道模拟题&#xff0c;这里主要总结如何处理时间信息和日期信息 对于时间信息&#xff1a;把时分秒转化成秒&#xff0c;相当…

基于java(springboot)网吧管理系统(java毕业设计)

基于java&#xff08;springboot&#xff09;网吧管理系统 网吧管理系统是基于java编程语言&#xff0c;mysql数据库&#xff0c;springboot框架和idea开发工具开发 &#xff0c;本系统分为会员&#xff0c;网管&#xff0c;管理员三个角色&#xff0c;会员功能是注册登陆系统…

基于JAVA的网上订餐外卖系统(Java+MySQL)

美食是人类永恒的话题,无论是在古代还是现代人们对美食都有一种非常的热爱在里面,但是随着时代的发展,人们可能没有更多的时间去研究美食,很多时候人们在下班或者放学之后更希望通过网络来进行订餐,为此我开发了本基于JAVA的餐必达网上订餐系统 本餐必达网上订餐系统采用Java语…

在写vue的项目中为什么index不能做key使用?

前言 在我们写vue的的项目时&#xff0c;我们是否会疑惑后端数据为什么都会带一个Id&#xff0c;而这个Id一般都作为循环中的key来使用&#xff0c;我们为什么不直接用index来作为他的key呢&#xff1f;这样不是更方便吗&#xff1f;下面我就带大家解决解决这和疑惑吧。 key的…

深度学习-归一化输入,梯度消失爆炸,梯度检验

文章目录前言一、归一化输入1、均值方差归一化2、why normalize input?二、梯度消失&#xff0c;爆炸1.梯度2.深度网络学习初始化三、梯度检验梯度检验前言 吴恩达 week5 一、归一化输入 1、均值方差归一化 均值方差归一化。 要注意&#xff1a;我们要对训练数据集和测试数…

探花交友_第9章_小视频方案(新版)

探花交友_第9章_小视频方案(新版) 文章目录探花交友_第9章_小视频方案(新版)1. 我的访客1.1 需求分析1.1.1 功能说明1.1.2 数据库表1.2 记录访客数据tanhua-modeltanhua-app-servertanhua-dubbo-interfacetanhua-dubbo-mongo1.3 首页谁看过我需求分析tanhua-modeltanhua-app-se…

小学生 C++画图 Go C 编程 第7课 奇异的花朵

第一课 GoC简介和演示 第一课 GoC简介和演示_ahwhjt的博客-CSDN博客_goc输入图形数量 第二课 了解编程环境 第二课 了解编程环境_ahwhjt的博客-CSDN博客_goc编程环境 第三课 基本绘图命令 第三课 基本绘图命令_ahwhjt的博客-CSDN博客_电脑编程的pen.lt 第四课 变量的引入 第…

重写 Nacos 服务发现:多个服务器如何跨命名空间,访问公共服务?

一、问题背景 在开发某个公共应用时&#xff0c;笔者发现该公共应用的数据是所有测试环境&#xff08;假设存在 dev/dev2/dev3&#xff09;通用的。 这就意味着只需部署一个应用&#xff0c;就能满足所有测试环境的需求&#xff1b;也意味着所有测试环境都需要调用该公共应用…

匆匆遭遇猿如意

刚刚收到一条消息&#xff0c;说有一个csdn的猿如意可以测试了&#xff0c;我就下载了一个&#xff0c;根据提示下载了&#xff0c;然后开始体验。 一、ChatGPT 谁让这个东西最近这么热呢&#xff0c;所以&#xff0c;我第一个就体验这个东东了&#xff0c;结果&#xff0c;结…

excel多条件预算:规划求解工具计算多产品最佳效益组合

江南皮革厂生产三种产品&#xff0c;皮鞋、皮手套、皮帽。三种产品需要原材料甲、乙、丙。近期&#xff0c;原材料供应有限制&#xff0c;生产工时也有限制。已知产品单件的用时、用料、利润&#xff0c;求如何组合产品利润最大。 一、加载规划求解工具 规划求解工具位于“数据…

CN域名隐私保护内测收费

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 据站长DNS Admin爆料&#xff0c;CNNIC向西部数码发布通知称&#xff0c;内测的CN域名WHOIS隐私保护服务即将暂停免费政策&#xff0c;继续使用将收取相应服务费用&#xff0c;价格为48元/个/年。 …

电脑重装系统后会闪屏是什么原因

​电脑的显示屏是我们日常使用电脑最常使用的硬件之一&#xff0c;可以说使用电脑必备的就是显示屏了。而显示屏在使用的过程中也会出现各种各样的问题&#xff0c;最近就有不少用户反应自己的电脑出现了黑屏闪烁的问题。 软件原因&#xff1a; 一、检查显示刷新率设置是否正确…

RTMP推流方案总结

由于项目需要 RTMP 推送 H264 数据&#xff0c;在网上查找了下相关的方案&#xff0c;总结一下。 RTMP协议简介 在总结之前&#xff0c;我们先简单介绍一下 RTMP 协议。 RTMP(Real Time Messaging Protocol) 实时消息传送协议是 Adobe Systems 公司为 Flash 播放器和服务器之间…

外卖订餐系统的设计与实现/点餐订餐系统

摘 要 随着外卖订餐在高校越来越普及&#xff0c;传统的电话订餐给顾客跟商家带来不方便,如何使订餐更快速&#xff0c;更方便已成为众多高校学生关注的问题了。本外卖订餐系统是针对高校商家进行具体的需求分析&#xff0c;采用JSP技术和采用SSM框架&#xff0c;MYSQL数据库…

QT制作窗口切换的小程序

QT制作窗口切换的小程序 前言&#xff1a;本次实验是在三个窗口之间自由切换&#xff0c;窗口中播放gif格式的动态图。 让我们先来看看使用到的主要的函数&#xff1a; 一、播放gif格式动态图的函数 QMovie *movie new QMovie("../form/1.gif"); // "../f…