2

私はクラスを持っており、このクラスのオブジェクトへのポインタはに配置する必要がありますstd::set。クラスでコンパレータを定義したいと思います。個別のクラスが定義されているか(ファンクターと呼ばれていると思います)、またはをオーバーロードする構造が定義されているソリューションをいくつか見てきましたoperator()。この定型コードを避け、コンパレータをクラス自体のメンバーとして定義したいと思います。これは、JavaのcompareTo()メソッドに沿ったものです。

私のクラスは次のようなものです。

class Item {
private:
    int id;
    float score;
.....
public:
// Rest of the methods and setters/getters
}

スコアの高いオブジェクトへのポインタがセットの最初に配置されるようにコンパレータを定義したいと思います。2つのスコアが等しい場合は、IDが小さい方が最初に配置されます。コードは次のようになると思いますが、この部分がよくわからなかったので、訂正してください(クラス自体の中に入れてほしい):

bool operator()(const Item* a, const Item* b) {
    if (a->score != b->score) return a->score > b->score;
    return a->id < b->id;
}

使用法は次のようになります。

std::set<Item*> sortedItems;
Item* item = new Item();
sortedItems.insert(item);

std::setクラス内で定義されている場合、テンプレートでコンパレータを指定する必要があるかどうかはわかりません。指定する場合は、どのようにすればよいですか。また、このコンパレータをクラス自体に追加するにはどうすればよいですか?私はSTLに不慣れであり、C++にもかなり不慣れです。ありがとう!

4

2 に答える 2

5

このソリューションは、この回答に触発されています。

#include <set>

class Item {
private:
    int id;
    float score;
public:
    struct compare {
        bool operator()(const Item* a, const Item* b) {
             if (a->score != b->score) return a->score > b->score;
             return a->id < b->id;
        }
    };
};

setを使用すると、独自の比較方法を定義できるため、次のように使用できます。

std::set<Item*, Item::compare> sortedItems;

これにより、クラスアイテムがセットで機能できるようになります

于 2012-10-11T14:13:33.740 に答える
2

実装は、whereとisをタイプのオブジェクトset<T>と呼びたいと考えています。その呼び出しが有効である限り、セットは気にしません。これは、 1つの引数をとる非静的メンバー関数、2つの引数をとる静的メンバー関数、または2つの引数をとる自由関数の場合があります。a < babT

class Item {
public:
    bool operator<(const Item& rhs) {
        return score == rhs.score ? id < rhs.id : score < rhs.score;
    }
static bool operator<(const Iterm& lhs, const Item& rhs) {
    return lhs.score == rhs.score ? lhs.id < rhs.id : lhs.score < rhs.score;
}
};

bool operator<(const Item& lhs, const Item& rhs) {
    return lhs.score == rhs.score ? lhs.id < rhs.id : lhs.score < rhs.score;
}

これら3つのうちどれでも大丈夫です。もちろん、2つ以上書くと、あいまいになります。

于 2012-10-11T14:07:59.047 に答える