greater/less C++ 中的函数对象

greater/less function objects in C++

我已经浏览了更多、更少的函数对象文档。虽然我确实有点了解其中的内容,但我还不明白。将按升序或降序对我的容器使用更大的排序吗?我特别困惑,因为以下两行似乎在做相反的事情。

std::priority_queue<int, std::vector<int>, std::greater<int> > q2;

for(int n : {1,8,5,6,3,4,0,9,7,2})
    q2.push(n);

print_queue(p2);

这会打印 0、1、2、3、4、5、6、7、8、9。但是,

int x[10] = { 1,3,5,7,9,2,4,6,8,10 };
std::sort(x,x+10,std::greater<int>());

打印这个会得到 10, 9, 8, 7, 6, 5, 4, 3, 2, 1。

如果有人能在我的示例中描述 'greater' 的工作原理,而不是仅仅说明 'greater' 的一般工作原理,那就太好了。

它将按升序排列,您将始终弹出队列中最小的元素。优先队列按照给定的顺序关系反向排序。

默认模板定义如下所示:

template<
    class T,
    class Container = std::vector<T>,
    class Compare = std::less<typename Container::value_type>
> class priority_queue;

它应用 less<>()(lhs, rhs) 来获得 "biggest" rhs 元素。但在您的情况下,它将应用 greater<>()(lhs, rhs) 来获取 "biggest" rhs 元素(这当然是最小的)。

另一方面,

std::sort 会保留您给它的订单类型。所以 std::less 将按升序排序,std::greater 将按降序排序。

std::greater<int> 反转整数的排序顺序。

std::priority_queue dequeues the next largest element by default,所以通过使用 std::greater<int> 你正在反转它所以它出列下一个最小的元素。

同样,std::sort 默认情况下将按升序对元素进行排序,但如果使用 std::greater<int>,您将看到降序排序。