![](/img/trans.png)
[英]Why can't I use a lambda as a comparator for a set defined in a class?
[英]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
,其中a
和b
是類型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.