AcWing
  • 首页
  • 题库
  • 题解
  • 分享
  • 问答
  • 活动
  • 应用
  • 吐槽
  • 登录/注册

sort中cmp的用法



2


2

问下,sort(a,a+n,cmp)中的cmp应该怎么去 理解?
最好有视频
求教各位大佬

排序

提问于17天前
纳兰晚宁
2030


1 个问答



1

不仅仅是sort, 在c++ stl的<algorithm>头文件中,大部分function支持一个返回值是bool类型的函数为参数, 这种函数叫做predicate函数。这个function内部实现会调用你提供的predicate函数来比较元素。
predicate可以是全局定义的函数,可以是一个struct重载了()操作符,也可以是一个lambda函数。
你可以去把常用的function都一个一个看一下。


对于sort
它告诉sort如何比较两个自定义的元素,一般sort的实现是把cmp(a, b) == true时,把a放在前面。
比方说我们有

typedef pair<int, int> pii;
vector<pii> v;

如果我们想按照pair的第一个元素从大到小排序:

sort(v.begin(), v.end(), [](pii p1, pii p2) { return p1.first > p2.first; });

如果我们想按照pair的第二个元素从小到大排列:

sort(v.begin(), v.end(), [](pii p1, pii p2) { return p1.second < p2.second; });

比方说count_if

它的可能实现是

template<class InputIt, class UnaryPredicate>
typename iterator_traits<InputIt>::difference_type
    count_if(InputIt first, InputIt last, UnaryPredicate p)
{
    typename iterator_traits<InputIt>::difference_type ret = 0;
    for (; first != last; ++first) {
        if (p(*first)) {   // 调用你提供的predicate函数来决定计数是否加一
            ret++;
        }
    }
    return ret;
}

如果我们有以下数组

vector<int> v;

如果我们要统计偶数

int cnt = count_if(v.begin(), v.end(), [](int x) { return x % 2 == 0; });

如果我们要统计2的个数

int cnt = count_if(v.begin(), v.end(), [](int x) { return x == 2; });
回答于16天前
houghstc
14466

蟹蟹了、 –  纳兰晚宁   16天前


我来回答
你确定删除吗?

© 2018-2020 AcWing 版权所有  |  京ICP备17053197号-1
联系我们  |  常见问题
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标
请输入绑定的邮箱地址
请输入注册信息