【发布时间】:2015-10-12 13:56:07
【问题描述】:
将常量值双精度数映射到整数的现代方法是什么?
我希望这仅作为标题包含。
我避开了#define,并从一组if 语句开始。
我相信if 语句更快(我将它们设置为优先级并在其中添加了一些gotos),但下面的开关似乎更具可读性。
我看了下面代码的反汇编,看起来很合理。
我不喜欢巨型开关。我认为可能有更好的现代方法(不会失去性能或需要链接)。
inline int InchtoGauge(double d)
{
switch (static_cast<int>(d * 10000))
{
case 2391: return 3;
case 2242: return 4;
case 2092: return 5;
case 1943: return 6;
case 1793: return 7;
case 1644: return 8;
case 1495: return 9;
case 1345: return 10;
case 1196: return 11;
case 1046: return 12;
case 897: return 13;
case 747: return 14;
case 673: return 15;
case 598: return 16;
case 538: return 17;
case 478: return 18;
case 418: return 19;
case 359: return 20;
case 329: return 21;
case 299: return 22;
case 269: return 23;
case 239: return 24;
case 209: return 25;
case 179: return 26;
case 164: return 27;
case 149: return 28;
case 135: return 29;
case 120: return 30;
case 105: return 31;
case 97: return 32;
case 90: return 33;
case 82: return 34;
case 75: return 35;
case 67: return 36;
default:return -1;
}
}
【问题讨论】:
-
将映射存储为排序数组并使用二进制搜索执行查找(例如
std::lower_bound)? -
关联数组,std::unordered_map 或类似的。如果没有太多,我确信映射将是唯一的,没有冲突,它会表现得很好。总比一个巨大的开关好。
-
对于值数组,我建议使用数组。这里的主要问题是浮点值很少在相等性上匹配。
-
你真的想让
InchtoGauge(0.1)返回-1吗?
标签: c++ c++11 dictionary