我需要在C++程序中使用静态表来查找组合。

这是一个简单的示例(我的表将大三到四倍):

int TABLE[3][3] = {
           /*2*/ /*4*/ /*8*/
    /*2*/   {4,    8,    16},
    /*4*/   {8,    16,   32},
    /*8*/   {16,   32,   64}
};

我喜欢这种表,因为从索引中查找组合非常容易,而且很容易看到组合。

但是,我不喜欢“键”仅在注释中定义的事实,这似乎是错误的。

是否有人在代码中定义了类似的表,并且有任何一般性建议吗?

编辑:我的表无法计算。它是程序的特定“设置”。

最佳答案

如果您需要固定的查找时间,并且不想使用unordered_map(例如,因为可以避免哈希计算,那么可以将编码与查找分开)。

  • 将数据编码为易于读取和读取的结构,包括元数据:
    struct TableElement {
        int row;
        int col;
        int val;
    } raw_table[] = {
        {2, 2,  4}, {2, 4,  8}, {2, 8, 16},
        {4, 2,  8}, {4, 4, 16}, {4, 8, 32},
        {8, 2, 16}, {8, 4, 32}, {8, 8, 64} };
    

    (您可以通过一些工作使某些东西变得更漂亮)
  • 从中初始化一次快速查找(一次在启动时)。可能是:
  • 一个不进行索引计算的稀疏数组,如Joachim的答案的后半部分
  • 密集数组,以实现更好的缓存行为
  • 甚至带有自定义哈希函数
  • 的那个unordered_map

    关于c++ - 在C/C++中声明这些表的干净方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16831873/

    10-11 22:43
    查看更多