C++ STL集合未按预期排序

C++ STL集合未按预期排序,c++,stl,C++,Stl,我有一个类,它包含成员a、B和C,我希望这个类的对象存储在集合中,其中ABC三元组是唯一的,应该是set键。但是,集合排序结果并不像预期的那样 我的比较函子是: class MyClassLess { public: bool operator() (const MyClass& t1, const MyClass& t2) const { if(t1.getA() < t2.getA()) return true; if(t

我有一个类,它包含成员
a
B
C
,我希望这个类的对象存储在
集合中,其中ABC三元组是唯一的,应该是set键。但是,集合排序结果并不像预期的那样

我的比较函子是:

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;
class MyClassLess{
公众:
布尔运算符()(常量MyClass和t1,常量MyClass和t2)常量{
if(t1.getA()
我希望集合中的元素首先按
A
排序,然后按
B
排序,最后按
C
排序。但是,如果我从
begin
end
遍历集合,排序顺序将是:

  • B
  • C
  • A
  • 换句话说,我得到一组成员,所有成员都有一个特定值
    B
    ,在该组中我看到
    C
    的所有值,对于
    C
    的每个值,我得到
    a
    的所有值


    你知道这是怎么回事吗?

    你的比较函数错了。以下是一个应该有效的版本:

    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();
      }
    };
    
    class MyClassLess{
    公众:
    布尔运算符()(常量MyClass和t1,常量MyClass和t2)常量{
    if(t1.getA()t2.getA())
    返回false;
    if(t1.getB()t2.getB())
    返回false;
    返回t1.getC()
    当左侧的
    A
    B
    小于右侧的相应成员时,算法需要返回
    false

    如果您只想正确实现值元组的比较,只需使用标准库元组的比较。您可以使用
    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());
    }
    
    #包括
    // ...
    布尔运算符()(常量MyClass和t1,常量MyClass和t2)常量
    {
    返回std::tie(t1.getA(),t1.getB(),t1.getC())
    

    但是,您仍然必须确保比较一组值实际上意味着什么。(提示:想想字典吧)

    停止使用电脑。拿出一支笔和一张纸,详细计算你的“排序”是否有意义。也许
    std::tie(t1.getA(),t1.getB(),t1.getC())
    ?好的,完成:-)我仍然希望真正的信息是,在开始编写代码之前理解数学很重要…@Kerrek:done。不过,您要回答的是,您需要知道正确的std库特性,并且忘记数学。(并不是说我会看不起它。如果你使用std-lib算法而不是编写自己的算法,你就不能把bug放进去。)