web-dev-qa-db-ja.com

Cの構造のようなマップ:intとstructを使用して値を決定します

以前はC++でコーディングしていたのですが、今はCでプログラミングしようとしています。

構造体を定義したと仮定します

struct point{
    int x;
    int y;
}

次の機能をサポートできるデータ構造Acにありますか:2つの整数、たとえばij、および2つの点を指定するとp1およびp2A[i][j][p1][p2]は値を一意に決定できます。

4次元配列のように聞こえます。ただし、インデックスはもはやintではなく、ユーザー定義のstructです。

14
user3341338

おそらく、独自の構造を作成する必要があります。 KernighanとRitchieによるCプログラミング言語には、cで関連マップを作成する例があり、以下で詳しく説明するのは、覚えていることに基づいていますそれから。

基本的に、struct Keyとstruct Valueを含むstruct Mapが必要です。

struct Map {
    struct Key key;
    struct Value value;
};

struct Keyには、値を決定する要素が含まれます(この場合は2ポイントと2 int)

struct Key {
    struct point p1;
    struct point p2;
    int i;
    int j;
};

struct Valueは、キーにポイントさせたいものです(言わなかった)

これで、4つの入力を値に関連付けるstruct Mapができましたが、単一のマップはそれほど役に立ちません。それらの配列全体が必要になります。

struct Map map[SIZE_OF_MAP];

探しているMap構造体の配列を直線的に検索したくない場合は、ハッシュ関数を作成して、その配列に直接アクセスできます。キーを受け取り、その値を使用して配列のインデックスを割り当てる関数を定義するだけです。ハッシュを使用してMapを配列に配置し、配列から取得します。 (注:これがハッシュの正しい例かどうかはわかりませんが、これが完全に間違っている場合は修正してください)

int get_hash(Key *key)
{
    int result;
    /* combine all inputs in some way */
    result = key->i * key->i + (key->p1.x * key->p1.x) - (key->p2.x * key->p2.x)
    /* make sure result isn't out of bounds of the array */
    return (result % SIZE_OF_MAP);
}

ハッシュ関数を使用する場合は、衝突を考慮する必要があります(2つのキーがget_hashに対して同じ結果を返すとどうなるか)。マップの配列を使用するときは、何らかの形の衝突解決が必要になります。

24
gslavin