高效的操作员<有多个成员

时间:2014-11-13 21:38:12

标签: c++ performance

假设一个类有多个与对象顺序相关的成员,例如A { T1 x; T2 y; };。 我知道operator<的标准实现是

bool A::operator<(const A& a) {
  return x < a.x || (x == a.x && y < a.y);
}

但这对我来说效率非常低,特别是当T1std::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<是一个糟糕的搜索字词。)

1 个答案:

答案 0 :(得分:3)

如果您的类型有两个(或更多)成员,应该按字典顺序进行比较,那么您通常已经在脑海中有一个订单,其中应该比较成员(即他们的“优先级”,例如,首先是“姓氏”,然后是“第一名”,用于对地址列表中的人进行排序。)

  • 如果您有这样一个固定的订单,您必须按此顺序检查它们(如果第一个不相等,则其他成员没有任何兴趣,因此您首先需要比较第一个成员)。

  • 如果您不需要特定的订单,那么请选择一些有效的订单:首先将这些成员放在快速比较的位置,然后将慢速订单放在最后,例如:向量。

然后,在您找到成员的“有效”顺序(此处,比方说xy)后,按字典比较两个对象,使用元组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等效的。