8

このサイトでは、優先キューを逆順にしたい場合は、次のコードを使用する必要があることを示唆しています。

#include <iostream>
#include <queue>
using namespace std;

class mycomparison{
    bool reverse;
  public:
    mycomparison(const bool &revparam=false) {reverse=revparam;}
    bool operator() (const int &lhs, const int &rhs) const {
      if (reverse) return (lhs>rhs);
      else         return (lhs<rhs);
    }
};

int main (){
  int myints[]= {10,60,50,20};

  priority_queue<int, vector<int>, mycomparison(true)> first;

  return 0;
}

これは私を悩ませます:

  • コンストラクターでストレージクラスを指定する必要があります。
  • 優先キューに渡すことだけを目的としたクラスを作成しました。

優先キューを逆ソートする、より洗練された、またはより冗長でない方法はありますか?

4

3 に答える 3

28

ストレージコンテナを指定することは避けられませんが、独自のファンクタを作成することは避けられます。

priority_queue<int, vector<int>, std::greater<int> > first;
于 2013-03-26T20:55:25.147 に答える
1

クラスを定義せずに柔軟性が必要な場合は、コンパレータのタイプstd::function>として使用できます。

#include <functional>

int main ()
{
    int myints[]= {10,60,50,20};

    // Use this is a the type of your comparator
    typedef std::function<bool(int, int)> comp_type;

    // Priority queue using operator < for ordering
    priority_queue<int, vector<int>, comp_type> first(std::less<int>());

    // ...

    // Priority queue using operator > for ordering
    priority_queue<int, vector<int>, comp_type> second(std::greater<int>());

    // ...

    return 0;
}
于 2013-03-26T21:01:56.140 に答える
0

構造体の優先キューを逆にしているときに、はるかに簡単な解決策を見つけました。私はそこから修正されたソリューションを持っています:structを使用したC++のstlpriority_queue

struct leaf
{
int symbol;
double probability;
bool operator < (const leaf &o) const 
    {
        return probability > o.probability; // here just reversed the operator
    }
};

priority_queue <leaf> leafs_queue; //queue already reversed
于 2020-11-03T09:43:40.907 に答える