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

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

概述我有一段令我困惑的代码: sort(data, data+count, greater<int>() ); 它是C标准库中的一个排序函数.我无法弄清楚第三个论点的含义.我已经读过它被称为二进制谓词.这是什么意思,我该如何做出我自己的这样的谓词? 第三个参数称为 predicate.您可以将谓词视为一个函数,该函数需要许多参数并返回true或false. 所以例如,这里是一个告诉你整数是否是奇数的谓 我有一段令我困惑的代码:
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或函子.

总结

以上是内存溢出为你收集整理的C STL sort()函数,二进制谓词全部内容,希望文章能够帮你解决C STL sort()函数,二进制谓词所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1254874.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存