繁体   English   中英

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

[英]Strcmp like behaviour applied on list of objects in C++

在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),...对是相同的键入或为其定义运算符<和>。

除了在C ++中具有巨大的if-else-if块之外,还有什么更好的方法来实现上述功能。

以上方法的@Edited用例就是这样。 我有一堂课

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

这里的MacAddr是一个类,它的比较运算符'<'仅比较字符串,而Interface是一个类,它比较两个整数值。 现在,我想为NextHop实现operator <。

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

在某些将来的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

另一种可能性是

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;
}

将您的比较减半

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM