STL设置未按预期排序

时间:2013-10-04 08:34:22

标签: c++ stl

我有一个包含成员ABC的类,我希望此类的对象存储在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排序。但是,如果我遍历从beginend的集合,则排序顺序为:

  1. B
  2. C
  3. A
  4. 换句话说,我得到的一组成员都具有B的特定值,在该组中,我看到C的所有值,以及{{1}的每个值然后我获得C的所有值。

    知道这里发生了什么吗?

2 个答案:

答案 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();
  }
};

当左侧的falseA小于右侧的相应成员时,您的算法需要返回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());
}

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