2

C++ では、プライオリティ キューを使用して次のように記述できます。

priority_queue<int, vector<int>, greater<int>> min_pq;
priority_queue<int, vector<int>, less<int>> max_pq;

C#コンテナでそれを行う同等の方法があるのだろうか? ユーザーがコンストラクターを使用するときにこの動作を指定する方法が必要な優先キューを実装しています。フラグを使用することもできますが、私にはboolean適切ではありません。何か案が?

public class PriorityQueue<T> where T : IComparable<T> {
     private List<T> data;

     /// <summary>
     /// 
     /// </summary>
     /// <param name="item"></param>
     public void Push(T item) {

     }

     /// <summary>
     /// 
     /// </summary>
     public void Pop() {

     } 
}
4

2 に答える 2

6

C# での慣用的な解決策はIComparer<T>、ジェネリック クラスのコンストラクターに のインスタンスを渡すことです。

public class PriorityQueue<T> {
    private readonly IComparer<T> comparer;
    public PriorityQueue(IComparer<T> comp = null) {
        comparer = comp ?? Comparer<T>.Default;
    }
}
于 2012-07-21T21:24:58.783 に答える
2

一般的な意味では、これは を参照することで実現できますint Comparer<T>.Default.Compare(T x, T y)。これにより、次のようなさまざまな実装パターンがラップされます。

  • IComparable(非ジェネリック)
  • IComparable<T>(ジェネリック)
    • および「持ち上げられた」操作の処理Nullable<T>

これは基本的にList<T>適用方法Sort()などです。

でも!制限を介して</> 演算子などを適用する直接的な方法はありません。演算子はジェネリックでは実際には機能しません。これは C++ テンプレートと同じではありません。

別のアプローチは、を使用することdynamicです。これは、ジェネリックでは「すべての T に対して」ではなく、型ごとに検査されるため、dynamic演算子を使用できます。ただし、値型のボックス化と少しの間接化が必要です。

于 2012-07-21T21:36:03.427 に答える