我有一个包含成员A
,B
和C
的类,我希望此类的对象存储在set
中,其中ABC三元组是已知是唯一的,应该是设置键。但是,设置顺序不会按预期结束。
我的比较函子是:
class MyClassLess {
public:
bool operator() (const MyClass& t1, const MyClass& t2) const {
if(t1.getA() < t2.getA())
return true;
if(t1.getB() < t2.getB())
return true;
return t1.getC() < t2.getC();
}
};
typedef set<MyClass, MyClassLess> SetMyClass;
我希望集合中的元素首先按A
排序,然后按B
排序,最后按C
排序。但是,如果我遍历从begin
到end
的集合,则排序顺序为:
换句话说,我得到的一组成员都具有B
的特定值,在该组中,我看到C
的所有值,以及{{1}的每个值然后我获得C
的所有值。
知道这里发生了什么吗?
答案 0 :(得分:4)
您的比较功能有误。这是一个应该有效的版本:
class MyClassLess {
public:
bool operator()(const MyClass& t1, const MyClass& t2) const {
if(t1.getA() < t2.getA())
return true;
if(t1.getA() > t2.getA())
return false;
if(t1.getB() < t2.getB())
return true;
if(t1.getB() > t2.getB())
return false;
return t1.getC() < t2.getC();
}
};
当左侧的false
或A
小于右侧的相应成员时,您的算法需要返回B
。
答案 1 :(得分:3)
如果您只想要一个正确的实现比较值元组,只需使用标准库元组的比较。您可以使用std::tie
创建引用元组,因此您的比较器只是:
#include <tuple>
// ...
bool operator() (const MyClass& t1, const MyClass& t2) const
{
return std::tie(t1.getA(), t1.getB(), t1.getC())
< std::tie(t2.getA(), t2.getB(), t2.getC());
}
但是,您仍然必须确保它实际上意味着什么来比较值元组。 (提示:想想“字典”。)