C++ STL自定义排序

news2024/11/25 16:24:35

更具体的看【速记】C++ STL自定义排序 - 知乎 (zhihu.com)

sort

sort第三个位置放的greater<int>和less<int>萌新可能会弄错,这两个单词不是更大和更小的意思,而是大于和小于,并且比较就是自定义排序中的前者后者。

如果是less,就代表 前者小于后者,那么自然是升序。

    vector<int>a;
    a.push_back(3);
    a.push_back(2);

    sort(a.begin(),a.end(),less<int>());

    for(auto i:a)cout<<i<<" ";

同理的,greater的意思就是 前者大于后者 自然就是降序,代码就不再展示了。

默认写法,就是使用less和greater,但是有时候默认排序可能不满足我们的要求,就要自定义了,下面记录一下都可以的。

1、使用cmp函数,cmp里面的a,b含义就是容器的前者和后者,因此这么写也是升序。

bool cmp(int a,int b){
    return a<b;
}

void solve(){
    vector<int>a;
    a.push_back(3);
    a.push_back(2);

    sort(a.begin(),a.end(),cmp);

    for(auto i:a)cout<<i<<" ";
}

当然你想容器里面套更多的元素也是可以的。

bool cmp(array<int,2> a,array<int,2> b){
    return a[0]>b[0];
}

void solve(){
    vector<array<int,2>>a;
    a.push_back({1,2});
    a.push_back({2,3});

    sort(a.begin(),a.end(),cmp);

    for(auto i:a)cout<<i[0]<<" "<<i[1]<<endl;
}

2、写法Lambda函数,本质上还是在用函数,不过把函数写成Lambda形式了。

    vector<int>a;
    a.push_back(3);
    a.push_back(2);

    auto cmp=[&](int a,int b){
        return a<b;
    };

    sort(a.begin(),a.end(),cmp);

    for(auto i:a)cout<<i<<" ";

或者使用Lambda形式的匿名表达式

    vector<int>a;
    a.push_back(3);
    a.push_back(2);

    sort(a.begin(),a.end(),[](int a,int b){
        return a<b;
    });

    for(auto i:a)cout<<i<<" ";

tip:改成int &a,int &b,不会更快,因为sort函数不会产生新数组,是在原有的数组上排序,观察sort可以发现,第一个是 首地址,第二个是 结束地址。

当然也可以使用function来封装函数。

    vector<int>a;
    a.push_back(3);
    a.push_back(2);

    function<bool(int a,int b)>cmp=[&](int a,int b){
        return a<b;
    };

    sort(a.begin(),a.end(),cmp);

    for(auto i:a)cout<<i<<" ";

3、重载运算符(个人感觉写个cmp函数更方便)

struct Node{
    int val;
    bool operator < (const Node &b){
        return val>b.val;
    }
}a[3];

void solve(){
    a[1].val=2;
    a[2].val=3;

    sort(a+1,a+2+1);

    cout<<a[1].val<<" "<<a[2].val;
}

因为默认是 less 排序,即升序,所以我们要重载小于号。

比如这里改成 前者大于后者(这里val就是前者,右边的那个常量就是后者)

输出就是

会自动排序的容器

类似set,map这种容器,我们就不能用sort了,要提前定好一个排序类,重载内部的排序。

比较方式不变,依旧是前者和后者的比较。

tip:优先队列排序,输出最后面的(如less升序,就输出最大值。greater降序,就输出最小值),如果要 重载优先队列,这一点要多注意。

理论上map和set只有 key是自动排序的,value不会,所以不建议对value自定义排序。

比如下面要对map重载成自动降序。

struct MyMap{
    bool operator() (const int &a,const int &b)const{
        return a>b;
    }
};

map<int,int,MyMap>f;

void solve(){
    f[1]=2;
    f[2]=1;

    for(auto i:f)cout<<i.fr<<" ";
}

显然这是没必要的。

因为map可以逆序遍历。

正序是 begin()->end()

逆序就是 rbegin()->rend()

r就是单词reverse(反向、逆向都行)的缩写。

重载自动排序的类,里面格式都是固定的,比如 bool operator() (const &,consg &)const{}

下面再放一个对自定义类自动排序的。

struct Node{
    int a,b;
};

struct MyMap{
    bool operator() (const Node &A,const Node &B)const{
        return A.a<B.a;
    }
};

map<Node,bool,MyMap>f;

void solve(){
    f[{2,1}]=1;
    f[{1,2}]=1;

    for(auto i:f){
        cout<<i.fr.a<<" "<<i.fr.b<<endl;
    }
}

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

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

相关文章

Small TopAppBar

Small 类型 TopAppBar AppBar 主要由2类&#xff0c;顶部 AppBar 和底部 AppBar。 顶部 AppBar&#xff1a;主要包含了标题&#xff0c;action菜单&#xff0c;导航菜单。底部 AppBar&#xff1a;典型地包含主要导航项。 顶部 AppBar 顶部 AppBar 包含了 4 中类型&#xff…

玩转小米:如何取消王者荣耀微信双开默认选择

文章目录 💢 问题 💢🏡 演示环境 🏡💯 解决方案 💯💢 问题 💢 当我们在手机上安装了多个微信(分身)后,在一些软件(例如王者)使用微信登入时会出现让们选择使用哪个微信进行登入,但是有时候我们不小心设置了默认某一个微信登入后,下次就无法出现选择页面…

物联网与智慧城市:融合创新,塑造未来城市生活新图景

一、引言 在科技飞速发展的今天&#xff0c;物联网与智慧城市的融合创新已成为推动城市发展的重要力量。物联网技术通过连接万物&#xff0c;实现信息的智能感知、传输和处理&#xff0c;为智慧城市的构建提供了无限可能。智慧城市则运用物联网等先进技术&#xff0c;实现城市…

信息系统项目管理师--项目整合管理

项⽬整合管理包括识别、定义、组合、统⼀和协调项⽬管理过程组的各个过程和项⽬管理活动。在项⽬管理中&#xff0c;整合管理兼具统⼀、合并、沟通和建⽴联系的性质&#xff0c;项⽬整合管理贯穿项⽬始终 项⽬整合管理的⽬标包括&#xff1a; ①资源分配&#xff1a; ②平衡竞…

【2024】vue-router和pinia的配置使用

目录 vue-routerpiniavue-routerpinia进阶用法---动态路由 有同学在项目初始化后没有下载vue-router和pinia&#xff0c;下面开始&#xff1a; vue-router npm install vue-router然后在src目录下创建文件夹router&#xff0c;以及下面的index.ts文件&#xff1a; 写进下面的…

每日一题-反转链表

&#x1f308;个人主页: 会编辑的果子君 &#x1f4ab;个人格言:“成为自己未来的主人~” 下面是代码的解题过程&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ typedef struct ListNode SLis…

【PowerMockito:编写单元测试过程中原方法没有注入的属性在跑单元测试时出现空指针】

出错场景 下面这一步报空指针&#xff0c;但是因为没有注入&#xff0c;在测试类中无法使用Mock 解决 在执行方法前&#xff0c;加入以下代码 MemberModifier.field(ResourceServiceImpl.class,"zero").set(resourceService,"0");

基于springboot的中小企业设备管理系统设计与实现论文

中小企业设备管理系统 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了中小企业设备管理系统的开发全过程。通过分析中小企业设备管理系统管理的不足&#xff0c;创建了一个计算机管理中小企业设备管理系统的方…

车载光控膜(汽车光线控制膜)行业迎来发展机遇 我国市场国产化进程加快

车载光控膜&#xff08;汽车光线控制膜&#xff09;行业迎来发展机遇 我国市场国产化进程加快 车载光控膜又称汽车光线控制膜&#xff0c;指通过控制光线出光方向&#xff0c;防止大尺寸车载显示屏反光倒影成像到挡风玻璃的功能性薄膜。车载光控膜具有提高视觉舒适度、保证车辆…

使用 Docker 部署 File Browser 文件管理系统

1&#xff09;File Browser 介绍 官网&#xff1a;https://filebrowser.org/ GitHub&#xff1a;https://github.com/filebrowser/filebrowser 今天为大家分享一款开源的私有云盘项目&#xff1a;File Browser&#xff0c;简单实用、轻量级、跨平台&#xff0c;安装部署简单快…

Maya笔记 软选择

文章目录 1什么是软选择2注意3如何打开软选择3.1方法一3.2方法二 4调整软选择的范围5衰减模式5.1体积模式5.2表面模式 6衰减曲线 1什么是软选择 也就是渐变选择&#xff0c;从中心点向外影响力度越来越小 软选择针对的是点线面这些模型元素 下图中展示了对被软选择的区域移动…

二、MySQL基础语法重点!(增删查改)

目录 一、SQL的增删改&#xff08;DML&#xff09; 1、添加数据 2、修改数据 3、删除数据 二、SQL查询&#xff08;DQL&#xff09; &#xff08;一&#xff09;基本查询 &#xff08;二&#xff09;条件查询 &#xff08;三&#xff09;聚合函数 &#xff08;四&#…

牛客网 华为机试 进制转换

本题是要将十六进制的字符串转换成十进制。看到题目第一眼就想到用map进行十六进制和十进制的映射。 然后我们需要注意&#xff0c;字符串前面会有0X&#xff0c;这只是一个标识十六进制的标识符&#xff0c;没有具体数字意义&#xff0c;我们在转换的时候&#xff0c;需要把它…

视频怎么压缩?不影响视频画质的三个方法

在数字化时代&#xff0c;高清晰度和4K视频的广泛应用使得我们在制作、分享和传输视频时拥有了更多的可能性。然而&#xff0c;随之而来的问题就是庞大的视频文件大小&#xff0c;不仅占用存储空间&#xff0c;而且在上传、分享和传输过程中可能遇到一系列的困扰。 为了解决这…

牛客网 华为机试 质因子

本题是要求一个数的所有质因子&#xff0c;包括重复的&#xff0c;比如180。首先质数就是素数&#xff0c;其只能被1和其本身整除&#xff08;1不是质数&#xff09;。比如2的因子只有1和2&#xff0c;3的因子只有1和3&#xff0c;5的因子只有1和5。 比如题中的180&#xff0c;…

小兴教你做平衡小车-stm32程序开发(PWM)

1 程序分享 main.c文件。 #include "stm32f10x.h" #include "led.h" #include "delay.h" #include "usart.h" #include "key.h" #include "tim.h" #include "pwm.h" #include "stdio.h"int…

挑战杯 基于深度学习的人脸表情识别

文章目录 0 前言1 技术介绍1.1 技术概括1.2 目前表情识别实现技术 2 实现效果3 深度学习表情识别实现过程3.1 网络架构3.2 数据3.3 实现流程3.4 部分实现代码 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的人脸表情识别 该项目较…

【S32K3驱动配置】-1.1-GPIO配置及其应用-点亮LED灯(基于SDK)

目录&#xff08;共10页精讲&#xff0c;手把手教你S32K3从入门到精通&#xff09; 实现的软件架构&#xff1a;基于Drivers层&#xff08;以往的SDK&#xff09; 前期准备工作&#xff1a; 1 创建一个FREERTOS工程 2 点亮评估板S32K312EVB-Q172中D13 LED灯 2.1 S32K312EV…

C++ 之LeetCode刷题记录(三十八)

&#x1f604;&#x1f60a;&#x1f606;&#x1f603;&#x1f604;&#x1f60a;&#x1f606;&#x1f603; 开始cpp刷题之旅。 目标&#xff1a;执行用时击败90%以上使用 C 的用户。 18. 四数之和 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target…

Thonny 开发环境下使用PICO系列教程1———利用Pico芯片内置传感器输出温度

Thonny 开发环境下使用PICO系列教程1———利用Pico芯片内置传感器输出温度 一、安装Thonny环境安装测试 在Thonny设定CircuitPython环境硬件部分Thonny部分 利用Pico内置温度传感器输出CPU温度 一、安装Thonny 下载链接&#xff1a; https://github.com/thonny/thonny/releas…