假设一个类有多个与对象顺序相关的成员,例如A { T1 x; T2 y; };
。
我知道operator<
的标准实现是
bool A::operator<(const A& a) {
return x < a.x || (x == a.x && y < a.y);
}
但这对我来说效率非常低,特别是当T1
为std::vector
时。 (当有更多成员时,阅读和维护效率甚低。)
是否有“标准” C ++ - 方式有效地比较事物?或者每个人都这样走自己的路:
enum Cmp = {LESS,EQUAL,GREATER}
Cmp A::CompareTo(const A& a) {
const Cmp c1 = x.CompareTo(a.x);
if (c1 != EQUAL) return c1;
const Cmp c2 = y.CompareTo(a.y);
return c2;
}
对于std::vector
,可能会使用std::mismatch
来实现此类CompareTo
?
(我确定这不是一个新问题,但operator<
是一个糟糕的搜索字词。)
答案 0 :(得分:3)
如果您的类型有两个(或更多)成员,应该按字典顺序进行比较,那么您通常已经在脑海中有一个订单,其中应该比较成员(即他们的“优先级”,例如,首先是“姓氏”,然后是“第一名”,用于对地址列表中的人进行排序。)
如果您有这样一个固定的订单,您必须按此顺序检查它们(如果第一个不相等,则其他成员没有任何兴趣,因此您首先需要比较第一个成员)。
如果您不需要特定的订单,那么请选择一些有效的订单:首先将这些成员放在快速比较的位置,然后将慢速订单放在最后,例如:向量。
然后,在您找到成员的“有效”顺序(此处,比方说x
和y
)后,按字典比较两个对象,使用元组用std::tie
构造,可以很容易地扩展到两个以上的成员。并且请作为非会员重载运营商。
bool operator<(const A& a, const A& b) {
return std::tie(a.x, a.y)
< std::tie(b.x, b.y);
}
如果你坚持使用pre-C ++ 11编译器(或不支持元组的编译器),你可以使用boost等效的。