2

最小優先度キューのベクトルがあり、それぞれがカスタムコンパレータクラスの異なるインスタンスで作成されています。キューのサイズは制限されているはずであり、キューがいっぱいの場合は、キューの最上位よりも優先度の高い要素のみを挿入して、最上位の要素をキックアウトできます。したがって、完全なキューに挿入する前に、挿入/削除のコストを回避するために、キュー自体のコンパレータを使用して、新しい要素をキューの先頭と比較したいと思います。コンパレータを再作成せずにそれを行うことは可能ですか?

編集:@Kerrekのハックは本当にクールですが、コンパレーターはパラメーターを使用してコンストラクターによって作成する必要があります。そこで、@ Spundunの回答を使用しました。また、印刷を高速化するために、基になるコンテナへのアクセスを使用しました。

4

2 に答える 2

4

コンパレータ オブジェクトはstd::priority_queue、その型でさえ公開されていないようです。汚いハックとして、コンパレータがステートレスでデフォルトで構築可能であるという仮定の下で、次のようなことを試みることができます。

template <typename> struct kidnap_comparator;

template <typename T, typename Cnt, typename Cmp>
struct kidnap_comparator<std::priority_queue<T, Cnt, Cmp>>
{
    typedef Cmp type;
};


// ...

template <typename PQ>
void insert_maybe(PQ & pq, typename PQ::const_reference x)
{
    typename kidnap_comparator<PQ>::type cmp;

    // use "cmp" to compare pq.top() and x
}
于 2013-01-10T23:46:49.300 に答える
1

コンパレータは保護されたメンバーです(compという名前、+1 Nate)。そのため、stl クラスから独自のプライオリティ キュー クラスを派生させ、関数として記述した機能を実装すると (insert_only_if_important() など)、その関数内からコンパレーターにアクセスできます。

于 2013-01-10T23:48:44.793 に答える