在set元素的类中定义的set的比较器

Par*_*esh 2 c++ stl set comparator

我有一个类,并且指向这个类的对象的指针需要放在一个std::set.我想要定义的比较里面的类.我已经看到了一些解决方案,其中定义了一个单独的类(我猜它被称为仿函数),或者定义了一个重载的结构operator().我想避免使用这个样板代码,并希望将比较器定义为类本身的成员,这与Java的compareTo()方法类似.

让我们说,我的班级是这样的:

class Item {
private:
    int id;
    float score;
.....
public:
// Rest of the methods and setters/getters
}
Run Code Online (Sandbox Code Playgroud)

我想以一种方式定义比较器,指向具有较高分数的对象的指针首先放在集合中.如果两者的分数相等,则首先放置具有较低id的分数.我想代码将类似于以下内容,但由于我不太了解这一部分,请纠正我(我希望将其放在类本身内):

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

用法如下:

std::set<Item*> sortedItems;
Item* item = new Item();
sortedItems.insert(item);
Run Code Online (Sandbox Code Playgroud)

std::set如果在类中定义,我不确定是否需要在模板中指定比较器,如果是,如何?另外,如何在类本身中添加此比较器?我是STL的新手,也是C++的新手.谢谢!

and*_*dre 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;
        }
    };
};
Run Code Online (Sandbox Code Playgroud)

因为set允许您定义自己的比较方法,所以您可以按如下方式使用它.

std::set<Item*, Item::compare> sortedItems;
Run Code Online (Sandbox Code Playgroud)

这应该允许您的类Item使用set