[解決済み] C言語の構造体のようなマップ:intとstructを使って値を決定する
質問
以前はC++でコーディングしていましたが、今はCでプログラミングしようと思っています。
構造体を定義したとします。
struct point{
int x;
int y;
}
データ構造はありますか?
A
で
c
は、以下の機能をサポートすることができます。
2つの整数が与えられたとき,例えば
i
と
j
という2つの点、例えば
p1
と
p2
.
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の配列を使用する場合は、何らかの形で衝突を解決する必要があります。
関連
-
[解決済み】"Expected expression before ' { ' token"(トークンの前に期待される式)。
-
[解決済み】MB/sとMiB/sを計算する方法は?
-
[解決済み】スタックスマッシュを検出しました
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み] C++でクラスと構造体はいつ使い分けるべきか?
-
[解決済み] C++の'struct'と'typedef struct'の違い?
-
[解決済み] .NETにおけるstructとclassの違いは何ですか?
-
[解決済み] ConcurrentHashMapとCollections.synchronizedMap(Map)の違いは何ですか?
-
[解決済み] プログラム終了前にmallocの後にfreeをしないと本当に何が起こるのか?
-
[解決済み] ストラクチャーとユニオンの違い
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】式は、単純なポインタ演算を使用して完全なオブジェクト型へのポインタでなければなりません【重複】。
-
[解決済み】ポインタへの代入時に互換性のないポインタ型からの初期化警告が発生した
-
[解決済み】GCC Cコードで静的宣言が非静的宣言に続くことを解決するには?
-
[解決済み】C言語で浮動小数点例外(コアダンプ)発生
-
[解決済み】警告:組み込み関数'printf'の非互換な暗黙の宣言(デフォルトで有効]
-
[解決済み】LinuxのI_PUSHに相当するもの
-
[解決済み】「複数の定義」「最初に定義されたのはここです」エラーについて
-
[解決済み】宣言指定子で2つ以上のデータ型がある場合のエラー【非公開
-
[解決済み】Makefile:1: ***セパレータがありません。停止します。
-
[解決済み】エラー:呼び出されたオブジェクトは、関数または関数ポインタではない