1

私はこの構造体を持っています:

struct Passenger
{
unsigned arrive;
unsigned depart;
};

次に、AとBのpriority_queueを逆の順序で作成する必要があります。演算子<をオーバーロードすると、同じ順序になります。

知りたいのですが、反対側のコンパレータを使用してこれらの優先キューを作成するにはどうすればよいですか?

4

5 に答える 5

1

次の比較子を指定できますstd::priority_queue

typedef std::priority_queue<Passenger, std::vector<Passenger>> min_queue;
typedef std::priority_queue<Passenger, std::vector<Passenger>, std::greater<Passenger>> max_queue;

または、ジェネリック:

template <typename T, typename Container = std::vector<T>>
using min_queue = std::priority_queue<T, Container>;

template <typename T, typename Container = std::vector<T>>
using max_queue = std::priority_queue<T, Container,
        std::greater<typename Container::value_type>>;

その後:

min_queue<Passenger> my_min_queue;
max_queue<Passenger> my_max_queue;
于 2013-03-06T14:41:03.230 に答える
1

std::priority_queue2 番目と 3 番目のテンプレート パラメータがあります。

  • 2 番目は基礎となるコンテナで、デフォルトはstd::vector
  • std::map3 つ目は、およびのような比較クラスです。std::set

したがって、 をオーバーロードしないoperator<でください。直感的に使用できないためです。代わりに、これらのコンパレータを実装します。

struct ArriveLess {
  bool operator()(Passenger const& lhs, Passenger const& rhs)
  { return lhs.arrive < rhs.arrive; }
};

struct DepartLess {
  bool operator()(Passenger const& lhs, Passenger const& rhs)
  { return lhs.depart < rhs.depart; }
};

/* ... */
std::priority_queue<Passenger, std::vector<Passenger>, ArriveLess> A;
std::priority_queue<Passenger, std::vector<Passenger>, std::not<ArriveLess>> B;
于 2013-03-06T14:45:50.867 に答える
1

調べてみることをお勧めします。そうすればboost::multi_index、さまざまな方法でアクセスできる単一のコレクションを持つことができます。

于 2013-03-06T14:42:09.360 に答える
1

プライオリティ キューを作成するときに、コンパレータを指定する必要があります。

// For the moment, I'm specifying these to just compare arrival times.
// Modify that as needed.
struct GT {
    bool operator()(Passenger const &a, Passenger const &b) { 
       return b.arrive < a.arrive;
    }
};

struct LT { 
    bool operator()(Passenger const &a, Passenger const &b) { 
        return a.arrive < b.arrive;
    }
};

std::priority_queue<Passenger, std::vector<Passenger>, GT> max_heap;

std::priority_queue<Passenger, std::vector<Passenger>, LT> min_heap;
于 2013-03-06T14:42:25.317 に答える
0

「比較」関数をプライオリティ キュー テンプレートに渡すことができます。

std::priority_queue<Passenger> A;
std::priority_queue<Passenger, std::vector<Passenger>, reverse_compare> B;

bool Passenger::reverse_compare(const Passenger& rhs)
{
  return rhs < *this;    /* Note reverse order! */
}

operator <編集:上記は、乗客に通常があることを前提としています。

【そして私は遅すぎる!】

于 2013-03-06T14:42:36.910 に答える