0

我有一个包含成员AB和的类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。但是,如果我遍历集合 from beginto end,排序顺序结果是:

  1. C
  2. 一个

换句话说,我得到了一组成员,它们都有一个特定的值B,并且在该组中,我看到了 的所有值C,然后对于 的每个值,C我得到了 的所有值A

知道这里发生了什么吗?

4

2 回答 2

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的时刻。AB

于 2013-10-04T08:37:24.300 回答
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());
}

但是,您仍然必须确定比较值元组的实际含义。(提示:想想“字典”。)

于 2013-10-04T10:35:04.647 回答