簡體   English   中英

在set元素的類中定義的set比較器

[英]Comparator for set defined in the class of the set elements

我有一個類,並且指向該類對象的指針需要放在std::set 我想要定義的類的比較。 我已經看到了一些解決方案,這些解決方案要么定義了單獨的類(我想它稱為函子),要么定義了使operator()重載的結構。 我想避免這種樣板代碼,並希望將比較器定義為類本身的成員,這類似於Java的compareTo()方法。

讓我們說,我的課是這樣的:

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

我想定義比較器,以將指向得分較高的對象的指針放在集合中的第一位。 如果兩者的分數相等,則將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 ++的新手。 謝謝!

該解決方案受到此答案的啟發。

#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;

這應該允許您的班級Item與set一起使用

set<T>實現要調用a < b ,其中ab是類型T對象。 只要該呼叫有效,該集合就不會在意; 它可以是帶有一個參數的非靜態成員函數,帶有兩個參數的靜態成員函數或帶有兩個參數的自由函數:

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;
}

這三個中的任何一個都可以。 當然,如果您編寫其中兩個或多個,則會產生歧義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM