dsi*_*cha 6 c++ math templates stl generic-programming
在C++中,假设我有一些x类型T,可以是整数或浮点类型.我想找到数量最多y类型的T为其y < x持有.需要模板化解决方案以使用整数和浮点数透明地工作.您可以忽略边缘情况,其中x已经是可以在a中表示的最小数字T.
可能的使用案例:这个问题被标记为过于本地化,因此我想提供一个我认为更通用的用例.请注意,我不是OP的原作者.
考虑这个结构:
struct lower_bound {
lower_bound(double value, bool open) : value(open? value+0.1 : value) {}
double value;
bool operator()(double x) { return x >= value; }
};
Run Code Online (Sandbox Code Playgroud)
此类模拟下限,可以打开或关闭.当然,在真实(双关语)生活中,我们不能这样做.流动是不可能的(或至少相当棘手)来计算S是所有实数.

但是,当S是一组浮点数时,这是一个非常有效的原则,因为我们基本上处理的是一个可数集; 然后没有开放或封闭的界限.也就是说,> =可以按照类似于lower_bound类的方式定义.
为了简化代码,我使用+0.1来模拟一个开放的下界.当然,0.1是原始值,因为可能存在值z,使得值<z <=值+ 0.1或值+ 0.1 = =浮点表示中的值.因此@ brett-hale答案非常有用:)
您可以考虑另一个更简单的解决方案:
struct lower_bound {
lower_bound(double value, bool open) : open(open), value(value) {}
bool open;
double value;
bool operator()(double x) { return (open ? x > value : x>=value); }
};
Run Code Online (Sandbox Code Playgroud)
但是,由于sizeof(Lower_bound)较大,而且operator()需要执行更复杂的语句,因此效率较低.第一个实现非常有效,也可以简单地实现为double,而不是结构.从技术上讲,使用第二个实现的唯一原因是因为你认为double是连续的,而它不是,我想它在可预见的未来不会是任何地方.
我希望我已经创建并解释了一个有效的用例,并且我没有冒犯原作者.
Bre*_*ale 10
如果你有C++ 11,可以使用std::nextafter在<cmath>:
if (std::is_integral<T>::value)
return (x - 1);
else
return std::nextafter(x, - std::numeric_limits<T>::infinity());
Run Code Online (Sandbox Code Playgroud)