STL 集未按预期排序

STL set not sorted as expected

本文关键字:排序 STL      更新时间:2023-10-16

我有一个包含成员ABC的类,我希望这个类的对象存储在一个set中,其中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;

我希望集合中的元素首先按A排序,然后按B排序,最后按C排序。但是,如果我从 begin 遍历集合到 end ,排序顺序为:

  1. C
  2. 一个

换句话说,我得到一组成员,它们都有一个特定的值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();
  }
};

您的算法需要返回false左侧AB小于右侧相应成员的时刻。

如果您只想正确实现值元组的比较,只需使用标准库元组的比较。您可以使用 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());
}

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