C ++中更大/更小的函数对象

时间:2016-11-27 07:33:59

标签: c++ sorting functor

我已经通过函数对象文档了解更多,更少。虽然我有点理解其中的内容,但我还没有得到它。我的容器会按升序或降序排序吗?我特别困惑,因为以下两行似乎正在做相反的事情。

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。

如果有人可以描述“更大”的话会更好。在我的例子中起作用,而不仅仅是说如何更大&#39;一般都是这样的。

2 个答案:

答案 0 :(得分:4)

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

默认模板定义如下所示:

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

它适用less<>()(lhs, rhs)来获得最大的&#34; rhs元素。但在你的情况下,它将适用greater<>()(lhs, rhs)来获得最大的&#34; rhs元素(当然是最小的)。

另一方面,

std::sort会保留您提供的订单类型。因此std::less将按升序排序,std::greater将按降序排序。

答案 1 :(得分:1)

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

std::priority_queue dequeues the next largest element by default,所以通过使用std::greater<int>,您可以将其反转,以便将下一个最小的元素出列。

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