std :: sort具有多个属性的等于对象

时间:2016-04-24 03:35:46

标签: c++ sorting std

我尝试对对象矢量进行排序,以便具有相同属性的对象彼此相邻。 Task是一个在某处获取并保存3个指针的类。

vec.push_back(Task(&propertyOne, &propertyTwo, &propertyThree));

如果我有一个充满了这些的向量,我想对它们进行排序,以便将等于TaskpropertyOnepropertyTwo的任何propertyThree放在旁边向量中的彼此。如果两个Task对象属性不相等,那么它们的去向并不重要。虽然他们很高兴能够找到他们最常见的Task对象。

我该怎么做?我已经尝试了显而易见的(return a.propertyOne == b.propertyOne),但似乎根本没有用,而且它只比较了第一个属性。

3 个答案:

答案 0 :(得分:3)

让我们的任务有三个属性a,b,c。要按正确的顺序对这些任务进行排序,您必须执行以下操作:

std::sort(v.begin(), v.end(), [](const Task& l, const Task& r) {
  if (l.a == r.a) {
    if (l.b == r.b) {
      return l.c < r.c;
    }
    return l.b < r.b;
  }
  return l.a < r.a;
});

答案 1 :(得分:3)

最佳解决方案是使用tuple<property*, property*, property*>而不是Task。这是comparison operators定义的,因此您只需对vec.push_back(make_tuple(&propertyOne, &propertyTwo, &propertyThree))中的每个条目执行:vec,然后进行排序:

sort(vec.begin(), vec.end())

如果Task必须比tuple<property*, property*, property*>更精细,则应为Task定义比较运算符:

bool Task::operator< (const Task& rhs) {
    return make_tuple(a, b, c) < make_tuple(rhs.a, rhs.b, rhs.c);
}

bool Task::operator== (const Task& rhs) {
    return a == rhs.a && b == rhs.b && c == rhs.c;
}

一旦定义了这两个,你可以再次这样做:

sort(vec.begin(), vec.end())

答案 2 :(得分:0)

我会使用包含几个三元运算符的简单lambda来实现它

std::sort(v.begin(), v.end(), [](const Task& l, const Task& r)
  {
      return (l.a == r.a) ?
          ((l.b == r.b) ? (l.c < r.c) : (l.b < r.b)) :
          (l.a < r.a);
  });

这显然假定可以使用a比较属性b==,并且可以使用<比较所有三个属性。

或者,您可能希望从<functional>std::equal_tostd::less等)提供适当的功能专精,并使用它们。