sort(data,data+count,greater<int>() );
它是C标准库中的一个排序函数.我无法弄清楚第三个论点的含义.我已经读过它被称为二进制谓词.这是什么意思,我该如何做出我自己的这样的谓词?
解决方法
所以例如,这里是一个告诉你整数是否是奇数的谓词:
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或函子.