【问题标题】:Strcmp like behaviour applied on list of objects in C++类似Strcmp的行为应用于C++中的对象列表
【发布时间】:2018-11-24 23:32:06
【问题描述】:

在 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 块之外,还有什么更好的方法来实现上述功能。

@已编辑 上述方法的用例是这样的。 我有课

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

这里的MacAddr是一个类,它的比较运算符'

【问题讨论】:

标签: c++ arrays string list stl


【解决方案1】:
bool operator<(...) {
  return std::tie(x,y,z,...) < std::tie(X,Y,Z,...);
}

【讨论】:

    【解决方案2】:

    在未来的某些 C++ 版本中,您可以使用新的比较运算符 &lt;=&gt; 来实现“任何类型的通用比较函数”(它返回与 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

    【讨论】:

      【解决方案3】:

      另一种可能是

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

      你的比较减半

      【讨论】:

        猜你喜欢
        • 2021-06-27
        • 1970-01-01
        • 1970-01-01
        • 2012-10-24
        • 2018-10-20
        • 1970-01-01
        • 1970-01-01
        • 2014-07-24
        • 2021-09-04
        相关资源
        最近更新 更多