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

本文介绍了C语言中的qsort函数和C++中的sort函数,两者都可用于排序,但sort更为灵活高效。qsort需要自定义比较函数,而sort可以接受lambda表达式,使得代码更简洁。此外,还详细讲解了lambda表达式的语法和用途,展示了如何在排序函数中使用lambda进行比较操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

qsort和sort与lambda表达式

qsort函数


  1. qsort函数为C语言标准库函数,包含在<cstdlib>头中,其涉及各种类型的排序,可将基本排序问题转化为比较大小的问题:
    • qsort(排序首指针,排序个数,单个元素字节数,比较函数)
  2. 其形参的参数包括自定义比较函数的调用,可采用指向函数的指针进行操作
  3. 编写比较函数的格式已经被限定,形参为两个 const void* 的指针,返回值为int,且第一个参数大于第二个参数返回正数,相等返回0, 否则返回负数, 故对于字符串的比较可以套用strcmp函数, 但不可将其直接作为比较函数使用(-_-参数格式不对)
  4. 只要能给出比较函数,qsort函数几乎能完成任何类型的排序
  5. qsort函数的四个参数分别为:第一个排序元素的指针,排序元素的个数,每个元素的字节数,比较函数的地址(二三参数可结合sizeof使用)
  6. qsort函数可以用于部分元素的排序,用第一、二个参数控制就行

:编写compare函数时,记得对传入的指针参数取值后进行比较,而不是比较指针本身

#include <iostream>
#include <cstdlib>
int compare(const void* a, const void* b) {
    return *(int*)a - *(int*)b;
}
int main(void) {
    int arr[5] = { 1,3,2,5,4 };
    std::qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), compare);
}

sort函数


  1. 功能同qsort函数,但适用范围更广,sort函数包含在<algorithm>头中,sort函数功能由模板实现,相较于qsort运行效率较高:
    • sort(排序首指针,排序尾指针,比较函数)
  2. sort函数的参数有三个,第一个是排序元素的首个元素地址,第二个是排序元素的尾元素地址,第三个是比较函数,不同于qsort函数,sort函数的比较函数形参不能是指针,可以是引用或者形参变量,返回值一般为bool类型,也可以为int
#include <iostream>
#include <array>
#include <algorithm>
int main(void) {
    std::array<int, 5> arr = { 1,3,2,5,4 };
    std::sort(arr.begin(), arr.end(), [](int m, int n)->bool {return m < n;});
}

lambda表达式


  1. 用于仅使用一次的函数的就地定义形式,如上面qsort和sort函数的compare函数就可以定义为lambda函数

  2. 格式: [capture] (parameters) mutable ->return-type {statement}

    • [capture] :捕捉列表。捕捉列表总是作为lambda的开始,即出现于lambda的开始处。它是lambda的引出符(即开始标志)。编译器可以根据该“标志”来作出判断出该函数是否为lambda函数。同时“捕捉列表”能够捕捉上下文中的变量以作为lambda函数使用。
    • (parameters):参数列表。和C/C++中的普通函数参数意义一样。该部分是可选的,意味着如果我们不需要进行参数传递时,可以连同括号“()”一起省略掉。
    • mutable:该关键字为一个修饰符。在默认的情况下,lambda函数总是返回一个const,而当我们在参数列表后面注明了“mutable”关键字之后,则可以取消其常量性质。若在lambda中使用了mutable修饰符,则“参数列表”是不可省略掉的(即使是参数为空)
    • ->return-type: 函数的返回值类型。和C/C++中的普通函数返回值类型的性质一样。主要目的是用来追踪lambda函数(有返回值情况下)的返回类型。若lambda函数不需要返回值,则可以直接将这部分省略掉。
    • {statement}:函数体。在该函数体中,除了可以使用参数列表中的变量外,还可以使用所有捕获到的变量(即[capture] 中的变量)。
    //e.g. 对于int[]的sort比较函数使用lambda函数;
    [](int& mm,int& nn)->bool{return mm < nn;} 
    //从小到大
    [](int& mm,int& nn)->bool{return mm > nn;}   
    //从大到小
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值