2

私はデータ構造を使用しており、これらのデータ構造を頻繁にソートしています。これらのデータ構造は、オブジェクト自体ではなく、オブジェクトへのポインタを保持しています。これで、単純な比較ファンクター (関数) を記述して、ポインターの並べ替え方法を並べ替えアルゴリズムに伝えることができます。

struct Object_ptr_comparer {
    bool operator()(const Object* first, const Object* second) {
        return *first < *second;
    }
};

たとえば、次のように使用しますstd::sort

Object_ptr_comparer comp;
std::sort(data_str.begin(), data_str.end(), comp);

このソリューションの唯一の問題は、任意のタイプのクラスに対して追加のポインター比較ファンクターを作成する必要があることです。はい、継承とポリモーフィズムを使用して、ルート クラスのコンパレータのみを記述できますが、そうしたくありません。これを行う他のスマートな方法はありますか?

4

2 に答える 2

10

テンプレートはどうですか?

struct ptr_comparer {
    template<typename T>
    bool operator()(const T* first, const T* second) {
        return *first < *second;
    }
};

次のように使用します。

std::sort(data_str.begin(), data_str.end(), ptr_comparer());
于 2012-11-26T21:37:07.010 に答える
8

それがテンプレートの目的です。

struct ptr_comparer {
    template<class Object>
    bool operator()(const Object* first, const Object* second) const {
        return std::less<Object>()(*first, *second);
    }
};

std::sort(data_str.begin(), data_str.end(), ptr_comparer());

比較子を直接特殊化するのではなく、演算子をテンプレート化したので、コンパイラは型を推測できるので、型を直接配置する必要はありません。

未定義の動作に依存するのではなく、 ポインターをポインター ( など) と安全に比較するため、std::lessではなくを使用します。にフォールバックするため、コードの呼び出しが複雑になることはなく、マイナス面はないはずです。operator<char**std::lessoperator<

私はこれがコンパイルされると確信しています

于 2012-11-26T21:37:25.210 に答える