Related to the third param of function “sort“ & Lambda of Cpp

C++ sort函数中利用lambda进行自定义排序规则 C++ sort函数中利用lambda进行自定义排序规则 一维vector<>排序 在c++中,由于sort()函数默认提供的是由小到大的排序方式,因此有时候我们需要自定义排序规则来实现由大到小的排序。 #include <bits/stdc++.h> using namespace std; void printvec(vector<int>& vec){ for(int i = 0; i < vec.size(); i++){ 阅读详情

1.前置题目:

1331.数组序号转换
1408. 数组中的字符串匹配
/>>>>>>>>>>>>>>>>>>>>>>>下面是后添加的例子
2418. 按身高排序

1.1.两道简单题,但分别对应了,两种不同的情况,即引出:

  • (单次排序后通过不改变原数组顺序得到其角标按照数组排序规律的数组)与lambda表达式的引出。

与1408的字符串与数组的搭配限制和传统实现:

  • 由于第一个数组类型是vector而不是vector,即遍历所用元素不对应,即简单的lambda表达式不再适用。

1.2 关于lambda表达式

I:用处

就用一次的简易函数?

II:构造

[caoture] (params) opt -> ret {body;};
  • [] 不捕获任何变量
  • [&] 捕获外部作用域中所有变量,并作为引用在函数体中使用(按引用捕获)
  • [=] 捕获外部作用域中所有变量,并作为副本在函数体中使用(按值捕获)
  • [=,&foo] 按值捕获外部作用域中所有变量,并按引用获取foo变量
  • [bar] 按值捕获bar变量,同时不捕获其他变量
  • [this] 捕获当前类中的this指针,让lambda表达式拥有和当前类成员同样的访问权限,如果已经使用了&或者=,就默认添加此选项,捕获this的目的是可以在lambda中使用当前类的成员函数和成员变量
    总而言之,"[]"里面放的就是需要在body作用域内部用到的,想要在body内用的就在这里取一下。

3、简单的lambda表达式(cpp)

[r = arr.data()](int a, int b){return r[a] < r[b];}

2.实例分析

2.1—leetcode_1331

code
class Solution {
public:
    vector<int> arrayRankTransform(vector<int>& arr) {
        vector<int> idx(arr.size());
        iota(idx.begin(), idx.end(), 0);
        sort(idx.begin(), idx.end(), [r = arr.data()](int a, int b){return r[a] < r[b];});
        //取到指针会更快
        int rk = 0, rear = INT_MIN;
        for(int x: idx){
            if(arr[x] != rear) ++rk;
            rear = arr[x];
            arr[x] = rk;
        }
        return arr;
    }
};

比较重要的地方就是sort的第三个参数,即lambda表达式。这道题由于要按照排序arr的方式排序其下标数组idx,即lambda表达式作为函数代替了传统的比较函数。且两个数组之间的联系都用int型变量,因此可以直接进行调用,arr的排序方法,作用于idx(sort前两个参数决定)。

  • 这里有一个小tips,由于"[]"取到的是在body里面用的数据,就猜想了一下是不是直接传arr而不是arr的头指针进去也可以呢?经过尝试发现结果是可行的,但是由于传入的是对象,即使经过自动判断r也是一个arr的对象,这样实例化对象次数太多会大大占用系统的空间并增加运行时间。
  • 那么再思考,是否直接取到对象的引用就可以了呢?答案是纯纯的老瘫儿,因为 “&arr” 和 “arr.data()”是一个东西。本质上其实都是数组。

但若出现容器装着不同类型的数据呢?这样直接的方法是否依然适用?答案是否。引出1408:

2.2—leetcode_1408

code-错误尝试
class Solution {
public:
    vector<string> stringMatching(vector<string>& words) {
        int wordsSize = words.size();
        vector<string>result;
        vector<int>everySize;
        for (size_t i = 0; i < wordsSize; i++)
        {
            everySize.push_back(words[i].size());
        }//初始化一波size数组为自定义bool base
        sort(words.begin(), words.end(), [r = everySize.data()](int a,int b){return r[a] < r[b];});
        //lamba表达式,sort的第三参,字符串数组的排序
        for (size_t i = 0; i < wordsSize; i++)
        {
            for (size_t j = i+1; j < wordsSize; j++)            {
                if(words[j].find(words[i]) != string::npos){
                    result.emplace_back(words[i]);
                    break;
                }
            }
        }
        return result;
    }
};
// @lc code=end

显然,我想通过对其对应字符串长度的排序方式来排序words,但是很遗憾,由于lambda表达式的局限性,入参是两个int的情况下是无法直接对应装着 string 的数组的(cmp函数不匹配)。那么要是直接写cmp函数的方式该如何实现呢?这里问了身边的同事:

bool cmp(const std::string &a, const std::string &b){
    if (a.size() != b.size()){
        return a.size() < b.size();
    } else/* 考虑到两者size相等的情况 */{
        return a < b;
    }
}

经过测试后,排序是成功的,那么写成lambda形式呢?

[](string &str1,string &str2){
	if (str1.size() != str2.size()){
        return str1.size() < str2.size();
    	} else/* 考虑到两者size相等的情况 */{
        	return str1 < str2;
    	}
	}

感觉和上面的bool-cmp没啥不一样,只是自动生成了函数返回值和名。。。。蚌埠了。
最后,挂个官方的暴力法题解吧:

class Solution {
public:
    vector<string> stringMatching(vector<string>& words) {
        vector<string> ret;
        for (int i = 0; i < words.size(); i++) {
            for (int j = 0; j < words.size(); j++) {
                if (i != j && words[j].find(words[i]) != string::npos) {
                    ret.push_back(words[i]);
                    break;
                }
            }
        }
        return ret;
    }
};

其中也有需要注意的点,即找字符串的子字符串的方法:words[j].find(words[i]) != string::npos

2.3—leetcode_2418.

code—错误尝试
class Solution {
public:
    vector<string> sortPeople(vector<string>& names, vector<int>& heights) {
        unordered_map<string, int>mp;
        for (int i = 0; i < names.size(); ++i) {
            mp.emplace(names[i],i);
        }
        sort(names.begin(), names.end() ,[&](const string &a, const string &b){
           return heights[mp[a]] > heights[mp[b]];
        });
        return names;
    }
};
  • 很明显我想通过建立int和string之间的关系,因为通过身高排序名字直接用lamda表达式是不可行的。就算我建立了名字到下标的映射,想直接用名字对应的高度拿下排序,用例中存在两个bob,真阴呐,名字无法单个映射到固定下标,可恶。
  • 尽管提示中没有出现相同的身高,不过在现实生活中还是身高重复更频繁一点,因此这道题还是要考虑的多一点。
code—题解
class Solution {
public:
    vector<string> sortPeople(vector<string>& names, vector<int>& heights) {
        int n = (int)names.size();
        int idxs[n];
        for (int i = 0; i < n; i ++){
            idxs[i] = i;
        }
        sort(idxs, idxs + n, [&](const int & i, const int & j){
            return heights[i] > heights[j];
        });

        vector<string> res;
        for (int i: idxs){
            res.push_back(names[i]);
        }
        return res;
    }
};

作者:XingHe_XingHe
  • 思路是初始化下标数组(只用数组存储下标用来接收按高度排序后下标的变化)
  • 根据指定的下标读取名字,按个push到结果数组内
  • 妙,我是傻逼

3、总结

1、想通过排序A的方式排序B,要是想使用lambda表达式的形式,那AB的入参形式一定要一样。
2、想通过模仿1131的形式,来通过建立字符串长度数组(对应角标是其大小对应的字符串)后,再对字符串数组进行排序,且想要其排序方式按照长度数组排序顺序的想法固然是是好的,但利用lambda表达式的形式并不ok,因为入参不一样,两个string和两个int并无法对应,系统无法识别。建议使用传统cmp或不简洁的lambda表达式。
3、第三题用了下标数组接收了变化,直接用unordered_map接收的方式无法cover重复名字或重复身高的情况,即双向不符合函数的映射性质。接收数组变化就完美适配了捏!如果要按照字典序就另说,差不多完美了。

思考

1、那通过将其长度作为主键利用map数据结构进行排序呢?啊,map不允许key重复啊,要保持映射唯一性。
2、映射不可以轻易建造捏,因为不管是string,还是长度都有可能重复。
3、加了中间层接收身高排序,结果用下标读name数组,那是真的牛批。
anyway,最后的解决方法就是像上面的总结说的,同参用lambda简单,不同参要是可以直接调其对象属性的情况下,还是写一个cmp吧。遇到无法正确映射或者双向映射都重复的时候,就想一想增加一个中间层!

5个4000比特大状态置换算法的设计与分析 下面是 5 个概念性、实验性的 4000 位可逆置换设计。它们都保证是双射,但未经过密码分析,不可直接用于生产系统。风格分别覆盖:三维 SPN、Feistel、可逆元胞自动机、ARX、宽轨迹/Keccak 式结构。 这 5 个设计分别代表了 SPN、Feistel、元胞自动机、ARX、宽轨迹 Keccak 五种不同风格,覆盖了主流大状态置换的构造思路。再次强调:它们只是实验性概念,若要用于实际协议,必须经过严格安全性分析。 阅读详情

相关推荐

基于互相关(NCC)模板匹配——find_ncc_model_defocused.hdev

相关性原理:仅在NCC(r,c) = ±1时,模板与图像完全匹配; NCC绝对值越大,表示模板与正在检测部分图像越接近; NCC绝对值越接近于零,表示模板与图像越不一致。 线性光照变化不会影响NCC计算结果。 重要函数一: 创建模板:create_ncc_model( Template : : NumLevels, AngleStart, AngleExtent, AngleStep, Metric : ModelID) 参数列表: Template(in):单通道灰度图像,它的区域可被创建为模板。 Num

m0_51271525的博客 3412

C++11 sort, vector, lambda——vector 自定义排序

vector自定义sort( ):std::sort大法好!std::vector大法好!lambda大法好!

caitao_zhan 3万+

Ribo测序翻译效率计算及可视化

本文介绍了一个计算翻译效率(TE)和分析转录-翻译相关性的生物信息学流程。首先通过Python脚本从标准化表达量矩阵(TPM/FPKM)计算TE值,该脚本自动匹配转录组(RNA)和翻译组(Ribo)样本进行比值运算。然后使用R语言进行相关性分析,通过ggplot2绘制样本间转录-翻译表达量的散点图,添加线性回归线和相关系数标注,支持PNG/PDF格式输出。整个流程实现了从原始数据处理到可视化分析的全过程。

Tiaoxiaobai的博客 552

c++的sort函数用lamda表达式自定义排序

sort函数,可以自定义compare的方法或者重载&amp;gt;来完成自定义排序,而lamda表达式,也可以完成这个功能,测试代码如下:#include &amp;lt;iostream&amp;gt; #include &amp;lt;vector&amp;gt; #include &amp;lt;algorithm&amp;gt; using namespace std; class A { public: A(int _a,int _b)...

dong_beijing的博客 4万+

数字IC设计避坑指南:为什么477条net的DRV问题无法修复?解析don‘t touch hierarchy的影响

本文深入解析了数字IC后端实现中,因“don't touch hierarchy”约束导致大量DRV违规(如477条net)无法自动修复的根本原因。文章以Cadence Innovus工具为例,详细阐述了DRV修复机制与设计保护约束的冲突原理,并提供了从日志定位、风险评估到分级解除约束的完整实战策略,帮助工程师有效解决此类设计收敛难题。

hope8的博客 288

Python自动化神器:5分钟搞定PSCAD仿真波形图导出到Word(附WPS兼容方案)

本文介绍如何利用Python自动化库快速将PSCAD仿真波形图导出到Word或WPS,大幅提升电力系统仿真工程师的工作效率。通过精准坐标定位、智能排版和批量处理功能,实现仿真报告的自动化生成,同时提供WPS兼容方案,适用于不同办公环境。

sony5的博客 207

C++:Lambda在sort中的使用

sort(res.begin(),res.end(),[x,y](const vector&lt;int&gt;a,const vector&lt;int&gt;b){ int s1=abs(a[0]-x)+abs(a[1]-y); int s2=abs(b[0]-x)+abs(b[1]-y); return s1&lt;s2; }); 解释:x,y是base,排序的目标是按照将这个点的集合,按照距离x,y的曼哈顿距.

BRAVE_NO1的专栏 6252

ABP框架实战:从零搭建多租户应用(含完整代码示例)

本文详细介绍了如何使用ABP框架从零构建多租户SaaS应用,涵盖多租户架构设计、数据隔离实现、租户管理及性能优化等核心内容。通过完整的代码示例,帮助开发者快速掌握企业级数据隔离系统的开发技巧,提升SaaS应用开发效率。

weixin_29247219的博客 261

c++中的qsort和sort和lambda表达式

qsort和sort与lambda表达式qsort函数sort函数lambda表达式 qsort函数 qsort函数为C语言标准库函数,包含在&lt;cstdlib&gt;头中,其涉及各种类型的排序,可将基本排序问题转化为比较大小的问题: qsort(排序首指针,排序个数,单个元素字节数,比较函数) 其形参的参数包括自定义比较函数的调用,可采用指向函数的指针进行操作 编写比较函数的格式已经被限定,形参为两个 const void* 的指针,返回值为int,且第一个参数大于第二个参数返回正数,相等返

来,骗!来,偷袭! 1845

最新版IAR9.40和注册工具

IAR最新版的IDE在编译速度和代码提示等各个方面上都有很大提升,软件这个东西果然还是越新越好。之前的时候,IAR v9系列网上很多人都说能用,但是又没有把 IAR v9系列的注册方法写的很清楚,导致我一直都用注册老版本v8的方法去注册v9。结果注册后都会提示。

xue_nuo的博客 4万+

T型三电平逆变器中点电位平衡详解

T型三电平逆变器(T-type Three-Level Inverter)是一种高效的多电平拓扑,相比传统NPC(Neutral Point Clamped)三电平逆变器,具有更低的开关损耗、更高效率和更简单的结构,尤其适用于中功率应用(如光伏逆变器、风电变换器和工业驱动)。(T-type Three-Level Inverter)中的应用已成为当前中高压功率变换领域(如光伏逆变器、储能PCS、电动汽车充电桩、风电并网和工业驱动)的热门方案。针对 T型逆变器,类似 NPC 的零序注入法适用。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 544

算法日常・每日刷题--<动态规划>42

本题为“不相交的线”,与最长公共子序列问题相似。使用动态规划求解:定义 dp[i][j] 表示 nums1[0:i] 与 nums2[0:j] 的最大不相交连线数。若元素相等,则继承左上值加1;否则取上方或左方最大值。最终返回 dp[m][n],即两数组的最大不相交连线数。时间复杂度 O(mn),空间复杂度 O(mn)。

2503_92261635的博客 15

MTK Meta ISP 工具使用技巧与参数读取路径全解析

在联发科(MediaTek, MTK)平台上进行相机图像调试时,Meta ISP 工具是连接 PC 与设备进行参数调整、寄存器读取和图像输出的重要工具。本文以实战角度出发,系统梳理 Meta ISP 的使用流程、关键模块功能、典型调试技巧与参数读取路径,结合最新版平台(如MTK Genio/Dimensity 系列)架构,帮助工程师掌握联发科图像调优的核心流程。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1146

C语言程序设计题|有序数组插入数字冒泡排序

题目要求将一个数插入有序数组末尾,并用冒泡排序实现整体升序。代码先将输入数存入数组最后位置,再通过双重循环进行冒泡排序,每轮将较大元素向后移动,最终输出11个升序元素。该方法虽时间复杂度为O(n²),但符合题目要求,逻辑清晰,适合初学者理解排序原理。

2301_81429079的博客 437

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex&trade;-M4F 内核的信息,请参见《Cortex&trade;-M4F 技术参考手册》。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【算法拾光】模拟|外观数列 + 数青蛙

本文总结两道模拟题解法:外观数列通过迭代统计连续数字个数生成下一项,关键在于处理末尾字符;数青蛙则模拟青蛙叫声“croak”状态转移,维护各阶段青蛙数量,记录最大并发数并确保全部完成。共性在于严格遵循流程、细致处理边界与非法情况,锻炼字符串遍历与状态管理能力。

wuqingyigexiaoba的博客 362

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

【数据结构-3】算法美学之降复杂度

在while循环的循环体内,首先用临时变量保存最后一个位置的数据,再通过for循环把所有元素往后移动一位,最后把tmp中保存的值放到下标为0的位置上去。方法二的思路是:创建新数组,让原数组中后k个数据移动到新数组中前面的位置,让原数组中前numsSize-k个数据移动到新数组中后面的位置,这。这段代码的思路是:三次逆置,第一次逆置前numsSize-k个数据,第二次逆置后k个数据,最后整体逆置。这篇博文分享一道解法不一的算法题,求解过程的目的在于降低算法的时间复杂度,题源力扣。,属于空间换时间的操作。

weixin_44218929的博客 77

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

AI和大模型—从克里金算法说开去

克里金算法源于矿业勘探,通过空间自相关性实现稀疏数据下的最优预测,核心优势在于不确定性量化。在AI大模型中,其等价于高斯过程,广泛应用于超参数优化、小样本建模与推理调度。尽管面临计算复杂度高、核函数选择难等问题,通过稀疏化、分治法与低秩近似可有效优化。该方法在降低训练成本、提升泛化能力及减少幻觉方面表现突出,尤其适用于高维、高成本的智能系统优化,具有重要借鉴价值。

fpcc的专栏 602

算法日常・每日刷题--<动态规划>32

给定严格递增的正整数数组,求最长斐波那契子序列长度。使用二维DP,dp[i][j]表示以arr[i]、arr[j]为最后两项的序列长度,初始化均为2。通过哈希表快速查找前一项target = arr[j] - arr[i],若存在且下标小于i,则状态转移:dp[i][j] = dp[k][i] + 1。遍历更新全局最大长度,最终若结果小于3则返回0。时间复杂度O(n²),空间复杂度O(n²)。

2503_92261635的博客 176

算法札记:几何分布在算法题UVA1262的运用

集卡问题求解核心:将集齐n种优惠券的过程分为n个阶段,每个阶段期望购买次数为 $ \frac{n}{k} $(k为剩余种类数),总期望为 $ n \cdot H_n $(调和数)。通过自洽方程推导单阶段期望,无需几何分布或无穷级数,逻辑清晰且适用于大一水平。例如,n=5时期望约11.42,非5。题目要求以带分数形式输出精确结果,算法上需累加分数并化简。

Keven_11的博客 306

不同的二叉搜索树

互不相同的二叉搜索树的种数,以 j (1<=j<=i)为头节点,左子树是 j-1 个数,右子树就是 i - (j - 1) -1 = i - j个数。所以dp[3] = dp[0] * dp[2] + dp[1] * dp[1] + dp[2] * dp[0]头1 = 左子树0节点 * 右子树2节点,二叉搜索树就是排序树,左子树<根节点<右子树,左右子树也满足左子树<根节点<右子树。头2 = 左子树1节点 * 右子树1节点。所以dp[i] += dp[j-1] * dp[i-j]个节点组成且节点值从。

qq_44721738的博客 150

SSL证书选RSA还是ECDSA:公钥算法、CA签名与兼容性怎么核对

申请SSL证书时,RSA和ECDSA该怎么选?先分清站点公钥算法、CA签名算法和TLS实际兼容性,再用隔离OpenSSL实验读取两类材料,核对申请、续期和部署交接,避免只看Signature Algorithm就选错。

谁呀!的博客 381

固件开发岗算法

背景:嵌入式固件岗,偏爱手写库函数、位运算、数组基础算法。

2502_90352018的博客 109

从曲线到储层:Techlog/KAPPA 全流程算法、UltraLAB 选型与本地 AI 部署实战

以高频 CPU 保证交互,以充足内存承载多井与多任务,以 NVMe 打通项目和知识库 I/O,再按本地模型、上下文与并发配置 GPU。对 UltraLAB 用户而言,更合理的采购方式是带着真实项目做选型:一组典型井、一套完整解释模板、一个目标大模型、一次多人并发测试。用实测结果确定配置,才能把预算转化为解释效率,而不是闲置算力。软件模块、操作系统与许可条件以厂商当前正式说明为准;硬件建议需结合项目实测。AI 输出只能作为辅助证据,不能替代岩石物理与油藏工程专业审核。

wdf8088的博客 161

【Deep-OC-SORT 01】多轨迹算法Deep-OC-SORT源码分析

本工程基于Deep-OC-SORT核心模块,重构并适配了EmbeddingComputer(外观特征提取)、CMCComputer(相机运动补偿)与OCSort(主跟踪器)三类。前者实现整框/网格模式的特征提取与L2归一化;后者通过稀疏光流或SIFT匹配估计仿射变换,补偿相机运动;主跟踪器融合IoU、外观相似度与方向一致性,支持模块开关与自定义组件,实现高效多目标跟踪。

Jayson 博客 330

C++ 标准库算法全景指南

本文系统梳理C++标准库<algorithm>与<numeric>中100+算法,按功能分为非修改、修改、排序、二分查找、归并、堆、极值、字典序、排列及数值操作十大类,涵盖典型用法与时间复杂度。结合C++20范围(ranges)与投影特性,实现更简洁高效的代码。

sss123ddd的博客 227
上一篇: Leetcode_088(Array)
下一篇: 序_凑五个字
Neepu_G.job
博客等级 码龄8年 7粉丝 69原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值