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>意思?
因此,如果更大的< 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或函子. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |