C++ 集合元素类中定义的集合的比较器
我有一个类,指向该类对象的指针需要放在C++ 集合元素类中定义的集合的比较器,c++,stl,set,comparator,C++,Stl,Set,Comparator,我有一个类,指向该类对象的指针需要放在std::set中。我想在类中定义比较器。我见过一些解决方案,其中要么定义了一个单独的类(我想它被称为函子),要么定义了一个重载操作符()的结构。我希望避免使用这种样板代码,并希望将比较器定义为类本身的一个成员,类似于Java的compareTo()方法 比如说,我的班级是这样的: class Item { private: int id; float score; ..... public: // Rest of the methods a
std::set
中。我想在类中定义比较器。我见过一些解决方案,其中要么定义了一个单独的类(我想它被称为函子),要么定义了一个重载操作符()
的结构。我希望避免使用这种样板代码,并希望将比较器定义为类本身的一个成员,类似于Java的compareTo()
方法
比如说,我的班级是这样的:
class Item {
private:
int id;
float score;
.....
public:
// Rest of the methods and setters/getters
}
我想以一种方式定义比较器,将指向得分较高的对象的指针放在集合的第一位。如果两者的分数相等,则id较低的一个放在第一位。我猜代码如下所示,但由于我不太理解这一部分,请纠正我(我希望将其放在类本身中):
bool运算符()(常数项*a,常数项*b){
如果(a->score!=b->score)返回a->score>b->score;
返回a->idid;
}
用法如下:
std::set<Item*> sortedItems;
Item* item = new Item();
sortedItems.insert(item);
std::set sortedItems;
项目*项目=新项目();
分类数据项。插入(项目);
如果在类中定义,我不确定是否需要在std::set
模板中指定比较器,如果需要,如何指定?另外,如何在类本身中添加这个比较器?我是STL的新手,对C++也比较陌生。谢谢 set实现想要调用a
,其中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;
}
类项目{
公众:
bool操作符此解决方案的灵感来自此
#包括
类项目{
私人:
int-id;
浮点数;
公众:
结构比较{
布尔运算符()(常数项*a,常数项*b){
如果(a->score!=b->score)返回a->score>b->score;
返回a->idid;
}
};
};
因为set允许您定义自己的比较方法,所以您可以按如下方式使用它
std::set<Item*, Item::compare> sortedItems;
std::set sortedItems;
这将允许您的类项目使用set您需要定义operator@ahenderson我明白了。这个参数将是指向项或项本身的指针?另外,如果运算符或者我没有注意到您有一组指针,那么编写一个顺序为两个t*
usi的模板化ptrOrder
,是非常简单的ngstd::less
,这反过来又默认为operator@MSalters我明白了。谢谢!但是既然项
类既没有这些,那么简单地编写一个比较器也就足够了。我认为std::set在比较指针时不会调用任何方法。谢谢!请注意,集合的类型将是集
,而ove刷新operator@ahenderson-是的。我没有注意到这个问题问的是一组指针。不过,我的答案是正确的,因为它谈论的是一个集合@Paresh-对于指针,你不能编写一个重载的操作符ep。这很好!谢谢!我希望在不必声明stru的情况下得到一些东西cture,但我想这是最好的方法。不过,作为类成员的结构比单独的结构或类要干净得多。再次感谢你!谢谢,这正是我搜索的!但是如果你更改一个已插入成员的分数会怎么样?我想你必须删除并重新插入它,因为集合本身不能检查其成员是否已更改,对吗?@v01pe如果您计划对集合中的内容进行更改,我会将其删除,首先进行更改,然后重新插入。
#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;
}
};
};
std::set<Item*, Item::compare> sortedItems;