【问题标题】:c++ why priority_queue greater<> result is different from sort`s greater result?c ++为什么priority_queue更大<>结果与排序的更大结果不同?
【发布时间】:2021-11-13 11:22:45
【问题描述】:

我搜索了类似的内容,但我不明白答案,所以我再次问你。

vector<int> v;
v.push_back(3);
v.push_back(11);
v.push_back(13);
v.push_back(-1);
v.push_back(-8);
v.push_back(324);
v.push_back(55);
sort(v.begin(),v.end(), greater<int>() );
for(auto i : v)
{
    cout << i << " ";
}

//结果是降序的

priority_queue<int, vector<int>, greater<int>> pq;
pq.push(3);
pq.push(5);
pq.push(4);
pq.push(9);
pq.push(13);
pq.push(15);
while(!pq.empty())
{
    cout << pq.top() << " ";
    pq.pop();
}

//结果是升序

这里还有更大的实现

struct greater : public binary_function<_Tp, _Tp, bool>
{
  _GLIBCXX14_CONSTEXPR
  bool
  operator()(const _Tp& __x, const _Tp& __y) const
  { return __x > __y; }
}

x > y 表示下降,但为什么呢?为什么特别是在优先级队列中,更大意味着上升?请有人清楚地澄清这一点。谢谢。

【问题讨论】:

    标签: c++ priority-queue


    【解决方案1】:

    因为它是这样定义的。上一个答案很好,但我会更加强调specification的另一部分

    请注意,Compare 参数的定义使其返回 true 如果它的第一个参数出现在它的第二个参数之前 订购。但是因为优先队列输出最大的元素 首先,“之前”的元素实际上是最后输出的。那 即,队列的前面包含“最后一个”元素,根据 比较强加的弱排序。

    所以“大”的意思是“先小”。

    【讨论】:

    • 还请注意,您正在通过“pop”从优先级队列中删除元素,但从前到后打印向量中的元素。如果您使用pop_back 打印矢量,他们会再次同意:两者都将打印降序。所以这种差异也是自己造成的。一侧使用 pop,另一侧不使用。
    【解决方案2】:

    来自this std::priority_queue reference

    优先级队列是一个容器适配器,它提供对最大(默认)元素的恒定时间查找

    [强调我的]

    因此使用std::less 的默认排序是降序。通过使用std::greater,您可以逆转这一点。订购。

    【讨论】:

      猜你喜欢
      • 2020-11-14
      • 1970-01-01
      • 2015-09-14
      • 1970-01-01
      • 2011-06-02
      • 2019-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多