c++ - 优化范围检查和返回值

标签 c++ c if-statement switch-statement

我有下面的函数,它根据输入返回一个值。我需要尽可能快地编写此代码,而不使用除法运算符或模运算符或循环。 每个连续的值由几乎等于 6553 的数量分隔。

int GetScalingFactor(int input)
{
    unsigned int factor = 0;

    if(input < 13107) factor = 72816;
    else if(input < 19660) factor = 81918;
    else if(input < 26214) factor = 93621;
    else if(input < 32767) factor = 109225;
    else if(input < 39321) factor = 131070;
    else if(input < 45874) factor = 163837;
    else if(input < 52428) factor = 218450;
    else if(input < 58981) factor = 327675;

    return factor;
}

最佳答案

在 C++ 中使用 std::lower_bound:

int GetScalingFactor(int input)
{
    const unsigned int inputs[] =  {13107, 19660, 26214, 32767, 39321, 45874, 52428, 58981};
    const int factors[] = {72816, 81918, 93621, 109225, 131070, 163837, 218450, 327675, 0};

    auto it = std::lower_bound(std::begin(inputs), std::end(inputs), input + 1);
    return factors[std::distance(std::begin(inputs), it)];
}

Demo

关于c++ - 优化范围检查和返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43274014/

相关文章:

c - 按多个参数对链表进行排序

excel - VBA:IF 语句中的意外行为。

ios - Xcode 6.1 if/else/for/switch 语句不自动完成(仅限 Swift)

c++ - 队列内存泄漏

c++ - 同时具有指针类型和常规类型的类模板

C++:std::istream 或 sentry 环绕的奇怪行为

c - 用于上下文切换的 gcc 内联汇编

c - 从 C 语言的双向链表中删除节点

将多个 if 更改为循环?

c++ - windows下如何正确使用共享内存