[英]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.