1. ホーム
  2. c

[解決済み] C言語の構造体のようなマップ:intとstructを使って値を決定する

2022-03-01 17:58:13

質問

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

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

struct point{
    int x;
    int y;
}

データ構造はありますか? Ac は、以下の機能をサポートすることができます。 2つの整数が与えられたとき,例えば ij という2つの点、例えば p1p2 . A[i][j][p1][p2] は値を一意に決定することができる。

4次元配列のような感じですね。しかし、インデックスはもはやintではなく、ユーザー定義の struct .

解決方法は?

自分で構造を作るしかないでしょう。 C言語(カーニガン、リッチー著 には、cでアソシエイトマップを作成する例があり、以下に詳述する内容は、そこから私が記憶したものを基にしています。

基本的には構造体である 地図 を含む構造体 キー と構造体 .

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

構造体 キー 値を決定する要素(あなたの場合は2ポイントと2int)を含む

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

構造体 は、キーを指すようにしたいものです (あなたは言いませんでした)。

これで、構造体 地図 しかし、1つのマップはそれほど便利ではありません。 しかし、1つのマップではあまり意味がありません。

struct Map map[SIZE_OF_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);
}

ハッシュ関数を使う場合、衝突を考慮する必要があります。 ゲットハッシュ ). Mapsの配列を使用する場合は、何らかの形で衝突を解決する必要があります。