C++ C++;使用成员字段设置比较器

C++ C++;使用成员字段设置比较器,c++,set,comparator,functor,C++,Set,Comparator,Functor,我想声明一个集合作为我的类的一个成员,我想给它一个自定义的比较器,它将使用其中的类实例字段 大概是这样的: 我怎样才能让它工作? 感谢因为错误状态MyClass::comp是bool(MyClass::)(int,int)不是bool(*)(int,int) 当您实际使用此时,使方法静态不是一个解决方案,您可以改为这样做 std::set<int, std::function<bool(int, int)>> my_set; std::设置我的设置; 然后 MyCl

我想声明一个
集合
作为我的类的一个成员,我想给它一个自定义的比较器,它将使用其中的类实例字段

大概是这样的:

我怎样才能让它工作?
感谢因为错误状态
MyClass::comp
bool(MyClass::)(int,int)
不是
bool(*)(int,int)

当您实际使用
时,使方法
静态
不是一个解决方案,您可以改为这样做

std::set<int, std::function<bool(int, int)>> my_set;
std::设置我的设置;
然后

MyClass() : my_set([this](int lhs, int rhs) { return blocks[lhs] < blocks[rhs]; }) {}
MyClass():我的集合([this](int-lhs,int-rhs){return blocks[lhs]
错误状态
MyClass::comp
bool(MyClass::)(int,int)
不是
bool(*)(int,int)

当您实际使用
时,使方法
静态
不是一个解决方案,您可以改为这样做

std::set<int, std::function<bool(int, int)>> my_set;
std::设置我的设置;
然后

MyClass() : my_set([this](int lhs, int rhs) { return blocks[lhs] < blocks[rhs]; }) {}
MyClass():我的集合([this](int-lhs,int-rhs){return blocks[lhs]
太棒了,谢谢!我刚刚找到了做同样事情的另一种方法(类似的想法,但使用结构):这个类的值语义在这样的设置中被破坏了。@BenjaminLindley你能详细说明一下吗,我不明白。你有什么建议?Thanks@YechielLabunskiy:如果复制、移动或分配此类对象,则第二个对象的比较函数将使用第一个对象的
this
指针,而不是其本身。然后,对第二个对象向量的任何更改都将在比较中忽略。更糟糕的是,如果第一个对象被销毁,第二个对象将留下一个悬空的指针。@YechielLabunskiy:另一种方法是使类更健壮。Jarod42的建议很好,但您需要进一步手动定义复制/移动构造函数和赋值运算符,以便每个对象的比较函数都有自己的
指针。或者,如果不想复制或移动对象,可以删除这些函数。太棒了,谢谢!我刚刚找到了做同样事情的另一种方法(类似的想法,但使用结构):这个类的值语义在这样的设置中被破坏了。@BenjaminLindley你能详细说明一下吗,我不明白。你有什么建议?Thanks@YechielLabunskiy:如果复制、移动或分配此类对象,则第二个对象的比较函数将使用第一个对象的
this
指针,而不是其本身。然后,对第二个对象向量的任何更改都将在比较中忽略。更糟糕的是,如果第一个对象被销毁,第二个对象将留下一个悬空的指针。@YechielLabunskiy:另一种方法是使类更健壮。Jarod42的建议很好,但您需要进一步手动定义复制/移动构造函数和赋值运算符,以便每个对象的比较函数都有自己的
指针。或者,如果不希望复制或移动对象,可以删除这些函数。