正确执行min

时间:2010-11-13 20:08:44

标签: c++ min theory

Tech-Talk about D的时间0:43:15,讨论了min函数的实现。在一些算法中使用时,关于“稳定性”和“额外改组(如果值相等)”的担忧被提议作为所示实现的原因之一。

任何人都可以提供真实/实际用例(或提供更详细的解释),其中min的这个特定实现是“稳定的”(又名更好)而不是其他可能的实现?或者这只是alpha-geeks走得太远的另一个例子?

推荐实施:

template <class LHS, class RHS, class Return>
inline Return min(LHS& lhs, RHS& rhs)
{
   return (rhs < lhs) ? rhs : lhs;
}

其他可能的实施:

template <class LHS, class RHS, class Return>
inline Return min(LHS& lhs, RHS& rhs)
{
   return (lhs < rhs) ? lhs: rhs;
}

提案N2199提供基于后者的实施,请注意此提案目前尚未成功。

与最低/最高有关的其他相关提案有N1840N2485N2551

2 个答案:

答案 0 :(得分:37)

在这种情况下,我很确定“稳定”指的是稳定,因为它应用于排序 - 即,当两个元素相等时,它们按照与它们开始时相同的顺序保持排序。要实现这一点,您希望在lhs小于或等于rhs时返回{ - 1}} - 但在C ++中,您(通常)只想使用operator<执行此操作,而不依赖于operator<=

答案 1 :(得分:-3)

一般情况下,一个实现与另一个实现没有任何优势。 如果您针对特定用途实施min,则可能有必要根据将应用的数据选择其中一个表单,以充分利用分支预测。

如果对于大多数使用情况,预期的最小值为rhs,请选择第一个实现。 如果是lhs,请选择第二个实现。