1

C++ クラスのリンク リストを作成していますが、ソート アルゴリズム用に 2 つのジェネリック型ノードを比較する方法を見つけようとしています。Java では Comparable インターフェースを実装し、compareTo() メソッドを使用してどちらが「大きい」か「小さい」かを判断し、コレクションのユーザーがこれを定義できるようにします。私が使用できるC ++に似たものはありますか? 「<」演算子をオーバーライドできることはわかっていますが、これが未知の型を比較す​​るための「最良の」方法であるかどうかはわかりません (主観的です。別の方法がある場合は、長所と短所を尋ねるだけです)。

では、「<」演算子をオーバーライドするよりも適切と思われる、実行時に不明な型を比較す​​る他のオプションはありますか?

編集:オーバーライドする必要がある演算子を変更しました。

4

2 に答える 2

2

私が集めたものから、あなたはリスト クラス テンプレートを持っていて、それにメソッドを実装したいと考えてsort()います。std::list<T>このために設定された例に従います。

template <typename T>
class List
{
public:
    // ...
    template <typename Compare>
    void sort(Compare compare) {
        // use compare(x, y) to determine if x is smaller than y
    }
    void sort() { this->sort(std::less<T>()); }
};

つまり、デフォルトで使用する固定の選択を行う代わりにoperator<()、ユーザーが別の順序付け述語を使用できるようにします。比較関数が厳密な弱い順序を実装している限り、何でも使用できます。

于 2012-11-11T22:44:35.860 に答える
1
  1. はい、演算子のオーバーロード (ソートの場合はoperator<and を使用するかもしれませんoperator==) がその方法です。これは慣用的であり、インターフェイスをマークする必要はなく (特定のインターフェイスから派生する場合など)、通常は行われません。

    良いことは、ユーザーが関係演算子なしで型を使用したい場合でも、演算子の無料の関数オーバーロードを提供することでインターフェイスを拡張できることです。

  2. 他の方法を使用することもできます (たとえばint T::cmp(...)、パラメータの関係に応じて 0/1/-1 を返す関数など、独自のインターフェイスを発明するなど)。ただし、これには再利用できないという大きな欠点があります。他人のクラス。

  3. STL は、ユーザーが渡した関数オブジェクト オブジェクトを使用して、必要なものを比較します。これは、同じデータに対して異なる並べ替え順序を提供するために必要です (たとえば、姓と電話番号で人を並べ替えるなど)。これが必要ない場合 (またはこの機能を放棄する準備ができている場合) は、そのまま使用できますoperator<

于 2012-11-11T22:46:03.290 に答える