【问题标题】:greater/less function objects in C++C++ 中更大/更少的函数对象
【发布时间】:2016-11-27 07:33:59
【问题描述】:

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

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。

如果有人可以在我的示例中描述“更大”的工作原理,而不是仅仅说“更大”的一般工作原理,那就太好了。

【问题讨论】:

标签: c++ sorting functor


【解决方案1】:

它将是升序的,你总是会弹出队列中最小的元素。优先级队列的排序与其给定的顺序关系相反。

默认模板定义如下:

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

它应用less&lt;&gt;()(lhs, rhs) 来获取“最大”的 rhs 元素。但在您的情况下,它将应用 greater&lt;&gt;()(lhs, rhs) 来获得“最大”的 rhs 元素(当然是最小的)。

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

【讨论】:

  • 在默认模板定义中,priority_queue 使用std::less。所以,默认情况下,不使用任何外部函子如更大,它不应该按升序打印吗?为什么它默认遵循降序呢?对不起,现在似乎部分明白了。仍然不明白为什么它会得到“最大”的 rhs 元素。
  • @AshwinBaskaran,模板将函子类型视为黑盒。黑匣子根据某些规则对元素进行排序。按照规则总有一个“最大”的元素,但按照整数的规则排序,它不一定是“最大”的,是不是更清楚了?
  • 是的,我现在可以理解了。更大/更少的函子基本上根据规则对数字进行排序。默认情况下,priority_queue 使用 std::less。我认为这里的规则是“最大”数字是具有最低整数值的数字。所以,这应该首先出现。那么默认情况下priority_queue不会按照升序排列吗?我知道我在某个地方出错了,只是不知道在哪里。
  • @AshwinBaskaran,priority_queue 根据规则取“最大”数。所以std::less&lt;int&gt;(1,2) == true21 之前的队列顺序。对于std::greater&lt;int&gt;(2, 1) == true12 之前排序。
  • 我现在可以看到了。我对订购部分感到困惑。有了您的原始答案和之前的评论,现在对我来说很明显。谢谢!
【解决方案2】:

std::greater&lt;int&gt; 反转整数的排序顺序。

std::priority_queuedequeues the next largest element by default,所以通过使用std::greater&lt;int&gt;,你正在反转它,所以它会将下一个最小的元素出队。

同样,std::sort 默认会按升序对元素进行排序,但使用 std::greater&lt;int&gt; 您会看到降序排序。

【讨论】:

  • 这样更容易理解。那么,认为更大的 总是会反转所有容器/容器适配器的自然排序顺序是否安全?
猜你喜欢
  • 2014-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多