C++比较函数cmp

2023-05-16

本文将简单介绍C++比较函数 cmp.

排序函数sort()

sort函数是我们常用的库函数,它的参数如下:

void sort (RandomAccessIterator first, RandomAccessIterator last, Compare cmp);

通过传入容器的迭代器(或指针),我们可以对指定位置进行排序:

vector<int> nums = { 1,3,2,4,5 };
sort(nums.begin(), nums.end()); //排序得到nums = { 1,2,3,4,5 }

可见,sort 函数的比较函数 cmp 默认参数为升序排列,当然也可以自定义函数来实现不同的排序方法。

比较函数cmp()

自定义比较函数

首先编写一个示例用以解释:

struct MyStruct {
    int weigth;
    string str;
};
bool cmp(const MyStruct& ms1, const MyStruct& ms2) {
    return ms1.weight < ms2.weight;
}
int main(){
    vector<MyStruct> msVector;
    sort(msVector.begin(), msVector.end(), cmp);
}

一般来说,cmp 函数具有以下规范:

  1. 返回值为 bool 类型,用来表示当前的排序是否正确。
  2. 参数为两个相同类型的变量,且类型与要排序的容器模板类型相同。

关于 cmp 作为比较函数实现排序的原理,可以这样来进行理解:在示例中,ms1 和 ms2 是两个参数,即 msVector 容器中的元素,且此时 ms1 位于 ms2 之前,此时函数的返回值其实就是给出此时排序的正确性。若正确则返回 true,反之返回 false。例如在示例中,该比较函数想要实现 MyStruct 结构体元素按照其 weight 值从小到大进行排列,因此返回值为 ms1.weight < ms2.weight。ms1 位于 ms2 之前,若 ms1.weight < ms2.weight,则返回 true,反之返回 false,与我们的预期相同。

标准库比较函数

如果只是想实现简单的容器的升序或者降序排列,可以直接使用 C++ 标准库中的比较函数:greater()less(),顾名思义,它们分别实现的是降序和升序排列。以下为使用示例:

vector<int> nums = { 1,3,2,4,5 };
sort(nums.begin(), nums.end(), greater<int>()); //排序得到nums = { 5,4,3,2,1 }
sort(nums.begin(), nums.end(), less<int>()); //排序得到nums = { 1,2,3,4,5 }

由此不难发现,sort 函数中 cmp 的默认参数就是 less<Type>().

简化比较函数

对于一个简单的比较函数,我们可以使用 lambda 表达式来对代码进行简化。(有关 lambda 表达式的内容,可以参考C++ 11 Lambda表达式)

使用 lambda 表达式,我们可以将“自定义比较函数”处的示例简化。

sort(msVector.begin(), msVector.end(), [](const MyStruct& ms1, const MyStruct& ms2){
    return ms1.weight < ms2.weight;
});

例题

题目链接:最大单词长度乘积

对于本题,比较容易想到的是暴力解法,但是直接进行暴力求解将会进行大量的无效计算。因此考虑将数组 words 按其元素的 string 长度从大到小进行排序,并依次两两判断是否是有效解,将有效解保存,在之后的遍历中若当前两 string 长度乘积不大于已保存的解,则立即终止当前循环。

而将数组 words 按其元素的 string 长度从大到小进行排序这一过程,就用到了 sort 函数以及自定义比较函数。

以下为解题代码:

class Solution {
public:
    bool isLegal(const string& s1, const string& s2) {
        for (const auto& ch1 : s1) {
            for (const auto& ch2 : s2) {
                if (ch1 == ch2)
                    return false;
            }
        }
        return true;
    }
    int maxProduct(vector<string>& words) {
        sort(words.begin(), words.end(), [](const string& x, const string& y) { return x.size() > y.size(); });
        int maxRes = 0;
        for (size_t i = 0; i < words.size(); i++) {
            for (size_t j = i + 1; j < words.size(); j++) {
                if (maxRes >= words[i].size() * words[j].size())
                    break;
                if (isLegal(words[i], words[j]))
                    maxRes = words[i].size() * words[j].size();
            }
        }
        return maxRes;
    }
};

本文同步发布在我的个人博客:C++比较函数cmp 欢迎访问

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++比较函数cmp 的相关文章

  • ubuntu与win10共享LE蓝牙鼠标

    类似的教程网上有很多 xff0c 大部分是找到蓝牙设备目录下info文件中的 linkKey 中的key值复制到win10下注册表中 xff0c 但是对于蓝牙5 0或LE设备来说 xff0c 是没有linKey的 xff0c 这里我也参考了
  • FileZilla搭建FTP服务器图解教程,并允许外网访问NAT内网

    FTP是用来在两台计算机之间传输文件 xff0c 是Internet中应用非常广泛的服务之一 FTP服务是网络中经常采用的资源共享方式之一 FTP协议有PORT和PASV两种工作模式 xff0c 即主动模式和被动模式 今天我分享一个最近我自
  • 十进制转换八进制(C语言基础)

    题目描述编程 xff0c 输入一个 xff11 xff10 进制正整数 xff0c 然后输出它所对应的八进制数 输入无输出无样例输入10样例输出12 include lt stdio h gt int main int num m 61 0
  • 【Godot】对 Godot 节点设计的思考

    对 Godot 中节点设计的思考 单个节点的功能设计的想法 xff0c 体会 Godot 的设计思想 低耦合 设计单个节点可复用的节点时 xff0c 调用方法尽量只对当前节点可获取到的变量或方法进行使用 xff0c 比如我写一个可以控制 K
  • 【Godot】行为树(一)了解与设计行为树代码

    行为树介绍 行为树是个节点树 xff0c 父节点通过不断遍历子节点 xff0c 根据不同类型的节点执行不同的分支 最终调用叶节点执行功能 行为树也不难理解 xff0c 他就像代码逻辑一样 xff0c 只是用节点的方式展现出来 xff0c 而
  • 【Godot 4.0】一个简单的匿名方法的使用lambda

    Godot 4 0 beta3 Godot 4 0 中添加了 lambda 表达式 xff0c 匿名方法等很多方便的特性 xff0c 这里我写个用于扫描目录下所有文件的功能 可以看到代码非常简洁 span class token keywo
  • aur报错(错误:一个或多个文件没有通过有效性检查)

    当我们从aur里安装软件时 xff0c 有时会出现这种报错 xff08 如安装deepin wine wechat xff09 61 61 gt 错误 xff1a 一个或多个文件没有通过有效性检查 xff01 Error downloadi

随机推荐

  • Java使用不同方式获取两个集合List的交集、补集、并集(相加)、差集(相减)

    1 明确概念 首先知道几个单词的意思 xff1a 并集 61 union 交集 61 intersection 补集 61 complement 析取 61 disjunction 减去 61 subtract 1 1 并集 对于两个给定集
  • 【VTK】VTK框选表面拾取三角面片——通过观察者命令模式

    VTK框选拾取三角面片 最近需要实现拾取三角面片的交互功能 xff0c 看了官方示例和网友分享 xff0c 都是使用vtkInteractorStyleRubberBandPick搭配vtkAreaPicker 但是具体实现方法都是选择继承
  • 【VTK】VTK框选表面拾取面片——仅选中前表面

    VTK框选表面拾取面片 仅选中前表面 接上一篇 VTK框选表面拾取三角面片 通过观察者命令模式 上一篇最后遗留一个问题 xff0c 框选表面后 xff0c 会把模型背面的面片也一起选中 所以这篇内容是解决该问题的 效果预览 功能说明 通过鼠
  • GoDB开发踩坑记

    前言 前几天因为leancloud网速太慢所以自己写了一个go语言数据库 xff0c 想部署到我的树莓派上 正文 我在写的时候发现了一些神奇的操作 golang 把js变量的表达方式字符串转换成go变量 可以先把它嵌入到一个json字符串中
  • 通过Java反射获得对象里面的所有字段名以及字段对应的值

    首先我们有一个对象类 span class token keyword package span com span class token punctuation span xuzihui span class token punctuat
  • GoDB开发踩坑记(代码实现)

    前言 之前写了一篇GoDB开发踩坑记但是内容有些不全 xff0c 所以来补充一下 所以没看过GoDB开发踩坑记的可以先看一下那篇文章 正文 golang encode josn 把map string interface 转换为json字符
  • vim配置

    众所周知 xff0c vim是一个非常牛逼的文本编辑器 xff0c 但是他的界面很丑 xff0c 而且在终端下面也不能美化多少 但是 xff01 在windows下有一个叫做gvim的玩意儿 xff0c 在mac下有一个叫macvim的东东
  • 全网最简洁Archlinux 安装教程

    Archlinux 安装教程 先从mirrors ustc edu cn下载archlinux安装镜像 然后下载刻录工具etcher Windows版 xff1a Windows版 Linux版 xff1a Linux版 Mac版 xff1
  • CF6E Exposition题解

    前置知识 st 表 xff1a 用于求静态的区间最值问题 不会的同学可以看wsyear巨佬的这篇文章https blog csdn net wsyear article details 114334351 spm 61 1001 2014
  • 最简单的柯西不等式证明

    柯西不等式证明 柯西不等式 xff0c 是形式如下的不等式 a i 2
  • CF1656E Equal Tree Sums题解

    其实这道题不难 首先假设 1 1 1 是根节点 我看到这道题第一反应就是直接假设整棵树权值之和是某一个定值 xff0c 然后再dfs造每一个 a x
  • CF1656D K-good题解

    这场比赛我没打 xff0c 错失上分好机会 这题是真的水 直接根据题意列出式子 xff1a n 61 k k
  • P7914 [CSP-S 2021] 括号序列 题解

    其实T2想清楚就不是很难 xff0c 虽然想清楚也不简单 我这里分享一种很自然的想法 xff0c 当然是区间dp啦 区间dp分6种状态 的种类数 xff0c 这种情况相当与题目中的 S S S xff0c 2到5中都一样 的种类数 xff0
  • 在Mac上安装好Anaconda,但在终端使用conda命令显示不是有效命令的解决方法

    最近新装的Mac OSX10 15 3 xff0c 新装了anaconda xff0c 从window到Mac的过渡 xff0c 有了诸多不适应 在终端中使用conda命令 xff0c 就会出现以下提示 zsh command not fo
  • LINUX 获取公网ip并发送邮件

    LINUX 获取公网ip并发送邮件 问题由来配置环境本机环境配置源 本段为CSDN博主 Tinghua M 创作编写sh文件 本段参考博主 手动销户了 问题由来 运营商的公网IP是动态的 xff0c 因此造成一段时间后无法访问公司资源 我们
  • Linux查看所有服务的状态

    Ubuntu 16 04环境 查看Linux所有服务的运行状态可输入命令 service status all 注意 xff1a all要紧跟在 status后面 xff0c 中间不要有空格 结果 那么 xff0c 服务名称前面的加减号 4
  • Qt 文件树的实现

    Qt 文件树的实现 xff08 QTreeWidget xff0c QTreeWidgetItem xff09 使用Qt框架创建文件树主要是使用了Qt仲的QTreeWidget控件和QTreeWidgetItem控件 其最主要的功能包括文件
  • chromeOS中Linux安装Flatpak,切换Flatpak数据源,安装Remmina应用

    本文基于ChromeOS 版本106 0 5249 112 xff08 正式版本 xff09 xff0c Debain 11版本 设置 开发者 Linux开发环境 启用 chromebook开启Linux容器 以下内容涉及到的技术均为Deb
  • 性能学习笔记--k8s下mysql的连接数分析和调优

    项目背景 xff1a k8s的架构下 xff0c 登录并发100后 xff0c 发现cpu的利用率过高 xff0c 超过75 xff1b 开始不知道是哪个微服务导致的cpu利用率过高 xff0c 需要进行分析 xff08 最终分析是mysq
  • C++比较函数cmp

    本文将简单介绍C 43 43 比较函数 cmp 排序函数sort sort函数是我们常用的库函数 xff0c 它的参数如下 xff1a span class token keyword void span sort span class t