1

ある既知の値セットから別の既知の値セットへのコンパイル時にチェック可能なマップを実行する必要があるプログラムがあります。

インアウト
------------
8 37
10 61
12 92
13 1/4 109
15 1/4 151
等

入力が整数または等間隔である場合、これは簡単です。私は行を反復処理するつもりですが、読みやすいマナーでルックアップを実行できるようにしたいと考えています。

私の現在の考え(私は好きではない)は、次のような列挙型を定義することです

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

次に、2 つのルックアップ用に設定します。

より良いアイデアはありますか?

編集:私の主な関心事は、検索しようとするものを制限することです。コードが無効なものを検索しようとする可能性がある場合は、コンパイルさえしないでください。

セットは小さく、反復時間はほとんど無関係です。

列挙型を超えて何かを得るものは何も見ていないので、今のところそれで行きます。OTOH この質問は引き続き見ていきます。

*注: ポインターなどの問題をキャッチすることについては心配していません。for ループや変数の割り当てなどの単純なコードだけです。


核心:明確さと一般性のために上記を単純化しすぎました。私は実際に、3 つの非整数で不均一な軸と 1 つの非数値軸を持つテーブルを持っています。そして、この時点では、それを列挙する必要がある方向がわかりません.

私が探しているものの風味を与えるためのいくつかのリンク:

Boost::SIと同じアイデアの私のDバージョン

4

6 に答える 6

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 に答える
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 に答える
0

ソートされたバイナリ ツリーのようなものを使用したいようです。ルックアップと反復の両方が高速で、ツリーはエントリの間隔を気にしません。

複数の軸が独立している場合は、軸ごとに 1 つ作成できます。

于 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 に答える
0

これを解決する方法を提案します。構造体と配列の使用。

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;
}

核心についてもう少し説明していただければ、おそらくいくつかの調整を行うことができます。

コンパイル時にチェックすることを決定している場合は、次のように列挙型を使用できます。

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 に答える