微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C STL sort()函数,二进制谓词

我有一段令我困惑的代码
sort(data,data+count,greater<int>() );

它是C标准库中的一个排序函数.我无法弄清楚第三个论点的含义.我已经读过它被称为二进制谓词.这是什么意思,我该如何做出我自己的这样的谓词?

解决方法

第三个参数称为 predicate.您可以将谓词视为一个函数,该函数需要许多参数并返回true或false.

所以例如,这里是一个告诉你整数是否是奇数的谓词:

bool isOdd(int n) {
    return n & 1;
}

上面的函数一个参数,所以你可以称之为unary谓词.如果它改为使用两个参数,那么您可以将其称为binary谓词.这是一个二进制谓词,告诉你它的第一个参数是否大于第二个参数:

bool isFirstGreater(int x,int y) {
    return x > y;
}

谓词通常由非常通用的功能使用,允许函数调用者通过编写自己的代码来指定函数的行为方式(当以这种方式使用时,谓词是callback的专门形式).例如,当排序整数列表时,请考虑排序函数.如果我们想在所有偶数之前对所有奇数进行排序怎么办?我们不希望每次要更改排序顺序时都强制写一个新的排序函数,因为排序的机制(算法)显然与细节无关(按照我们想要的顺序分类).

所以让我们给我们自己的一个谓词进行排序,使其反向排序:

// As per the documentation of sort,this needs to return true
// if x "goes before" y. So it ends up sorting in reverse.
bool isLarger(int x,int y) {
    return x > y;
}

在这将按相反的顺序排列:

sort(data,isLarger);

这样做的方式是内部比较整数对,以决定哪一个应该在另一个之前.对于这样一对x和y,它通过调用isLarger(x,y)来实现.

所以在这一点上,你知道一个谓词是什么,你可以在哪里使用它,以及如何创建自己的.但是,更大的< int>意思?

greater<T>一个二进制谓词,它告诉它的第一个参数是否大于第二个参数.它也是一个模板结构,这意味着它有许多不同的形式,基于它的参数的类型.需要指定此类型,因此更大的< int>是类型int的模板专业化(如果您需要,请阅读C模板上的更多内容).

因此,如果更大的< T>是一个结构体,它怎么也可以是谓词?我们不是说谓词是函数吗?

那么,更大的< T>是一个调用功能:它定义了操作符bool operator()(const T& x,const T& y)const;这使得写这个合法:

std::greater<int> predicate;
bool isGreater = predicate(1,2); // isGreater == false

类型的对象(或C中的结构与C中几乎相同)被称为function objects或函子.

原文地址:https://www.jb51.cc/c/111824.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐