类似于Strcmp的行为应用于C ++中的对象列表

时间:2018-06-15 06:27:09

标签: c++ arrays string list stl

在cpp中,我想知道是否有更好的方法来执行以下操作:

bool operator<(...) {
    if( x < X )
      return true;
    else if ( x > X )
      return false;
    else if ( y < Y )
      return true;
    else if ( y > Y )
      return false;
    else if ( z < Z )
      return true;
    else if ( z > Z )
      return false;
    .... so on
    else
      return false;
}

这类似于在列表[x,y,z,...]和[X,Y,Z,...]之间应用strcmp类型的功能。这里x和y的类型(或y和z或X和Y)可能不相同,但是对(x,X)和(y,Y)和(z,Z),...是相同的输入或拥有运营商&lt;和&gt;为他们定义。

除了在C ++中使用一个巨大的if-else-if块之外,还有更好的方法来实现上述功能吗?

@Edited 用于上述方法的用例就是这样的。 我有一个班级

NextHop{
  macAddr : MacAddr;
  intf : Interface;
... so on
}

这里MacAddr是一个类,它的比较运算符&#39;&lt;&#39;只是比较字符串,接口是一个类,它比较两个整数值。现在我想实现一个运算符&lt;对于NextHop。

3 个答案:

答案 0 :(得分:7)

bool operator<(...) {
  return std::tie(x,y,z,...) < std::tie(X,Y,Z,...);
}

答案 1 :(得分:0)

在将来的某个C ++版本中,您可以使用新的比较运算符<=>来实现“任何类型的通用比较函数”(它返回类似于strcmp的值,-1, 0或1,基于第一个更小,相等或更大)。 [这只会有助于为一个类型编写一个更通用的比较运算符的意图 - 如果你有三对单独的变量就没那么真正有帮助]

但是,对于C ++的当前版本,如果您有许多不同类型的变量[成员变量或常规变量],您最终必须一次进行一次比较。对于上面的特定模式,您可以通过这种方式缩短序列,但如果有三个以上的值,它仍然会变得非常冗长......

if (x < X) return true;
if (x == X)
{
    if (y < Y) return true;
    if (y == Y) return z < Z;
}
return false;

以上将是您检查日期是否小于另一个日期的方式,例如,当输入为年,月,日时 - 假设X为年,Y月和Z一天。

对于大量相同类型的值,您当然可以使用std::lexicographical_compare

答案 2 :(得分:0)

另一种可能性是

bool operator<(...) {
    if( x != X )
      return (x < X);
    else if (y != Y)
      return (y < Y);
    else if (z != Z)
      return (z < Z);
      .... so on
    else
      return false;
}

将比较结果减半