1

我有一个程序需要执行从一组已知值到另一组已知值的编译时可检查映射:

进出
------------
8 37
10 61
12 92
13 1/4 109
15 1/4 151
ETC

如果输入是整数或均匀间隔,这将很容易。我将遍历行,但也希望能够在可读的庄园中进行查找。

我目前的想法(我不喜欢)是定义一个像

enum Size
{
   _8,
   _10,
   _12,
   _13_25,
   _15_25,
   // etc
}

然后将其设置为 2 次查找。

有更好的想法吗?

编辑:我主要关心的是限制我可以尝试查找的内容。如果代码可能会尝试查找无效的内容,我希望甚至无法编译的东西。

集合很小,迭代时间几乎完全不相关。

我还没有看到任何让我在枚举中获得任何东西的东西,所以现在我要这么做了。OTOH我会继续关注这个问题。

*注意:我不担心会发现指针问题等等,只是像 for 循环和变量赋值这样的直接代码。


本质:为了清晰和通用性,我过度简化了上述内容。我实际上有一个表,它有 3 个非整数、非均匀轴和一个非数字轴。在这一点上,我不确定我需要在哪些方向上列举它。

一些链接可以让我了解我正在寻找的内容:

Boost::SI和我的D想法一样

4

6 回答 6

1

除非您对变量名进行丑陋的解析,否则使用枚举会丢失数值。我会这样做:

class Size
{
    public decimal Val{get;set;}
    private Size(decimal val){this.val = val;}
    public static Size _8 = new Size(8.0);   
    //...
    public Dictionary<Size, Size> sizeMap = new Dictionary<Size, Size>
    {
        {_8, _37}, 
        //...
    };
}
于 2008-12-09T20:25:23.147 回答
1

你不能使用哈希映射吗?

于 2008-12-07T23:54:25.457 回答
1

如果您的输入分数限制为某个 2 的幂分母,您可以使用定点数作为键。对于您的示例情况,使用 1 位 = 0.25,(将每个输入乘以 4),如下所示:

IN maps to Key
--         ---   
8          32   
10         40
12         48 
13 1/4     53
15 1/4     61 

KeyMin= 32

然后,您可以使用 Key-KeyMin 作为稀疏数组的索引,该数组包含一个标志值,例如 -1 用于无效条目。优点是,如果您的密钥发生变化,它可以让您不必重新编码。缺点是浪费内存。

于 2008-12-08T23:32:51.380 回答
0

Here is a suggestion to how you could solve it. Using structs and arrays.

typedef struct{
    float input;
    int   output;
}m_lookup;
m_lookup in_out[] = 
{   
    (float) 8   , 37,
    (float)10   , 61,
    (float)12   , 92,
    (float)13.25,109,
    (float)15.25,151,
};

int get_Var(float input)
{
    int i=0;
    for(i=0;i<sizeof(in_out);i++)
        if(in_out[i].input == input)
            return in_out[i].output;
    // Here you could make some special code for your compiler
    return 0;
}
int main(void)
{
    printf("Input 15.25 : Output %d\n",get_Var(15.25));
    printf("Input 13,25 : Output %d\n",get_Var(13.25));
    printf("Illegal input:\n");
    printf("Input 5 : Output %d\n",get_Var(5));
    system( "pause" );
    return 0;
}

I could probably make some sdjustments if you explain a little more about the The nitty grity.

If you are determend to get it checked at compile time then you can use the enum like this:

enum Size
{
   i_8=37,
   i_10=61,
   i_12=92,
   i_13_25=109,
   i_15_25=151,
   // etc
}
于 2008-12-09T07:25:40.943 回答
0

听起来您想使用排序二叉树之类的东西。查找和迭代都很快,树不会关心条目的间距。

如果您的多个轴是独立的,您可以为每个轴创建一个。

于 2008-12-07T23:47:57.793 回答
0

枚举的想法并不太糟糕,但我会动态地去做。您有一个有效字符串的数组/列表。字符串列表的索引是您的地图的关键。

// this could be loaded from a file potentially
// notice that the keys have been sorted.
const char* keys[] = { "10", "12", "13 1/4", "15 1/4", "8", 0 };
float values[] = { 61, 92, 109, 151, 37, 0 };
int key_count = 0;
while (keys[key_count]) ++key_count;

bool find(const char* key, float* val) {
   int idx = bsearch(key, keys, sizeof(const char*), key_count, strcmp);
   if (idx < 0) return false;
   *val = values[idx];
   return true;
}

现在,你说过这里不止一个维度。这只是意味着您需要多个键数组。

于 2008-12-08T01:09:57.537 回答