集合元素类中定义的集合的比较器

Comparator for set defined in the class of the set elements

本文关键字:集合 比较器 定义 元素      更新时间:2023-10-16

我有一个类,指向该类对象的指针需要放在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;

这应该允许你的类项目与设置一起工作

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

这三个人中的任何一个都可以。当然,如果你写了两个或两个以上,你会有歧义。