我尝试对对象矢量进行排序,以便具有相同属性的对象彼此相邻。 Task
是一个在某处获取并保存3个指针的类。
vec.push_back(Task(&propertyOne, &propertyTwo, &propertyThree));
如果我有一个充满了这些的向量,我想对它们进行排序,以便将等于Task
,propertyOne
和propertyTwo
的任何propertyThree
放在旁边向量中的彼此。如果两个Task
对象属性不相等,那么它们的去向并不重要。虽然他们很高兴能够找到他们最常见的Task
对象。
我该怎么做?我已经尝试了显而易见的(return a.propertyOne == b.propertyOne
),但似乎根本没有用,而且它只比较了第一个属性。
答案 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_to
,std::less
等)提供适当的功能专精,并使用它们。