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; });