我有一段令我困惑的代码:
sort(data, data+count, greater<int>() );
这是C标准库中的一个排序函数,我不明白第三个参数的含义。我看到它被称为二元谓词(binary predicate)。这是什么意思?我该如何编写自己的谓词函数呢?
第三个参数被称为谓词。你可以将谓词看作是一个函数,它接受若干个参数并返回true
或false
。
例如,下面是一个判断整数是否为奇数的谓词:
bool isOdd(int n) {
return n & 1;
}
以上函数接受一个参数,因此可以称其为一元谓词。如果它接受两个参数,你会称其为二元谓词。下面是一个二元谓词,用于判断其第一个参数是否大于第二个参数:
bool isFirstGreater(int x, int y) {
return x > y;
}
sort
函数需要对整数列表进行排序时。如果我们希望将所有奇数排在偶数之前进行排序怎么办?我们不想被迫每次都编写新的排序函数以更改排序顺序,因为排序的机制(算法)显然与具体要求(我们希望它按什么顺序排序)无关。
所以让我们为sort
添加自己的谓词,使其可以反向排序:
// 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, data+count, isLarger);
std::greater<int> predicate;
bool isGreater = predicate(1, 2); // isGreater == false
可调用的类类型对象(或者在 C++ 中几乎等同的 struct
)被称为函数对象或functor。
greater
的类模板,需要一个类型参数。所以你提供了一个int
。它变成了greater<int>
,然后你创建了这个类的一个实例,并将其作为第三个参数传递给函数。()
运算符。它是一个可调用的实体。就像这样:template<typename T>
struct greater
{
bool operator()(const T &a, const T &b)
{
//compare a and b and return either true or false.
return a > b;
}
};
greater<int>
的实例,例如对象是g
,那么可以编写g(100,200)
,它将计算出一个布尔值。因为表达式g(100,200)
调用了operator()
,并传递100
作为第一个参数和200
作为第二个参数,operator()
比较它们并返回true
或false
之一。 std::cout << g(100,200) << std::endl;
std::cout << g(200,100) << std::endl;
输出:
0
1
bool IsIntGreater(int First, int Second)
{
return First>Second;
}
std::greater<T>
类型是一个模板函数对象,在您的片段中创建了一个临时对象 std::greater<int>
并传递给 std::sort
算法。
与函数相比,函数对象具有几个优点,特别是当它们必须作为参数传递时,请参阅这里以获取更多信息。
greater
会使其按降序排序。 - UncleBenssort(data, data+count, isSmaller);
中,你从未提到x
或y
,那么isSmaller
如何知道要比较什么? - Anonsort
调用之后添加了一个简短的解释。是否足够? - Jon