c++ - 如何使用C++ 11声明静态查找表

标签 c++ c++11 stdmap lookup-tables std-pair

我有C++ 11程序,需要从一系列值中选择一个值。每个范围都有一个分配的值以从中选择一个值。
以下是我的值范围以及为每个值分配的值。

1-10 = 5
11-14 = 13
15-20 = 17
21-28 = 24
29-36 = 31
37-47 = 43
48-52 = 50
53-60 = 53
61-68 = 65
因此,如您所见,如果输入介于1到10之间,则上面的5应该是返回值,如果输入介于11到14之间,则应该选择13。
可以通过下面的程序通过if else语句的大量列表来达到上述要求。
#include <iostream>

// Following are return values to chosen based on which range the input value falls within
// 1-10 = 5
// 11-14 = 13
// 15-20 = 17
// 21-28 = 24
// 29-36 = 31
// 37-47 = 43
// 48-52 = 50
// 53-60 = 53
// 60-68 = 65

unsigned int GetValueBasedOnRange(const int value) {
    int value_picked_from_appropriate_range = 0;

    if (value > 1 && value < 10) {
        value_picked_from_appropriate_range = 5;
    } else if (value > 11 && value < 14) {
        value_picked_from_appropriate_range = 13;
    } else if (value > 15 && value < 20) {
        value_picked_from_appropriate_range = 17;
    } else if (value > 21 && value < 28) {
        value_picked_from_appropriate_range = 24;
    } else if (value > 29 && value < 36) {
        value_picked_from_appropriate_range = 31;
    } else if (value > 37 && value < 47) {
        value_picked_from_appropriate_range = 43;
    } else if (value > 48 && value < 52) {
        value_picked_from_appropriate_range = 50;
    } else if (value > 53 && value < 60) {
        value_picked_from_appropriate_range = 53;
    } else if (value > 61 && value < 68) {
        value_picked_from_appropriate_range = 65;
    } 

    return value_picked_from_appropriate_range;
}

int main() {
    unsigned int value_within_a_range = 42;
    std::cout << GetValueBasedOnRange(value_within_a_range) << std::endl;
}
上面的程序可以正常工作,但是很大的语句列表是不好的。同样,如果将来会有更多的值和范围,它们会影响if else逻辑。在C++ 11中,有没有办法我可以建立一个不错的静态查找表来实现此目的,而不必另外编写?我可以在头文件中声明输出值的静态表吗?
在C++ 11中执行此操作的一些聪明方法?我大概可以尝试std::map<std::pair<unsigned int, unsigned int>, unsigned int>吗?但是,想知道使用该方法还是什至更简单的方法。
PS:我不确定它是否称为查询表或其他东西。但是,它会为特定的一对值/范围的值选择一个硬编码的值。

最佳答案

如果索引具有特殊含义,则此方法可能会有所帮助。初始化在编译时完成,因此在执行期间为O(1):

#include <array>

template<typename ARRAY>
constexpr void fill_range(ARRAY& array, int first, int last, int value)
{
    for(int i = first; i <= last; ++i)
        array[i] = value;
}

constexpr std::array<int, 69> make_table()
{
    std::array<int, 69> a {0};
    fill_range(a, 1, 10, 5);
    fill_range(a, 11, 14, 13);
    fill_range(a, 15, 20, 17);
    fill_range(a, 21, 28, 24);
    fill_range(a, 29, 36, 31);
    fill_range(a, 37, 47, 43);
    fill_range(a, 48, 52, 50);
    fill_range(a, 53, 60, 53);
    fill_range(a, 61, 68, 65);
    return a;
}

constexpr auto arr = make_table();

int main()
{
      return arr[65];
}

关于c++ - 如何使用C++ 11声明静态查找表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63194960/

相关文章:

c++ - 在 unix 中使用信号同步进程

c++ - `std::vector` 的快速哈希函数

c++ - 如何让map.emplace在c++17中自动选择构造函数?

c++ - 静态 map 初始化

c++ - CMake 只接受 add_subdirectory 中的 `find_package(Qt5Widgets REQUIRED)`,而不是根项目

c++ - libmarkdown2(优惠)线程安全使用?

c++ - 在 C++ 中不在整个 std::string 中打印引号给出负 ASCII 值?

具有 Fluent 界面的 C++ Builder 模式

c++ - std::map 有没有办法在 O(1) 时间内给出所有键 <= target_key 的计数器?

c++ - 优化此 OpenGL 渲染算法