Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 集合元素类中定义的集合的比较器_C++_Stl_Set_Comparator - Fatal编程技术网

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
,是非常简单的ng
std::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;