2010-12-29 14 views
2

Cでキーと値のペアを構成してアクセスするにはどうすればよいですか?愚かな単純な例を使用するには、整数とその平方根の間で変換するテーブルを作成したいとしましょう。Cでの辞書/マップ/キーと値のペアのデータ構造

私はJavaScriptを書いていた場合、私はこれを行うことができます:

var squareRoots = { 
    4: 2, 
    9: 3, 
    16: 4, 
    25: 5 
} 

をして、同じようにアクセス:

var squareRootOf25 = squareRoots[5] 

Cでこれを行うにはきれいな方法は何ですか?ある種類の列挙型をキーとして使用し、別の種類の列挙型を値として使用する場合はどうなりますか?

答えて

3

これを実現するには、C言語のハッシュ実装を検討することができます。 ハッシュの基礎については、Wikipediaを参照してください。 詳細とリンクについてはquestionを参照してください。

このlinkは、概要と実装の詳細がよくわかります。

+0

Cコードまたはリソースファイルを生成するためのドメイン固有の言語を記述するのに手間がかからないため、コンパイル時にあらかじめ定義されたルックアップテーブルを合理的に指定することはできません。バイナリ検索にソートされた配列さえ、順序エラーが発生しやすくなります。 +1はとにかく、それはほとんど確実に問題ではないからです。シンプルなアイテムの配列から、アプリケーションの初期化中にデータ構造を記入するだけです。ランタイムコストはほとんど問題ではありません。とにかくJavascriptの例では効果的ですが、言語提供のコンテナ充填コードを使用しています。 – Steve314

+0

実行時生成は私の現在のニーズには問題ありません。 – morgancodes

1

あなたがC99で、このような配列を初期化カウントしない限り、これを行うには、組み込みの方法はありません。

double squareRoots[] = 
{ 
    [4] = 2.0, 
    [9] = 3.0, 
    [16] = 4.0, 
    [25] = 5.0, 
}; 

しかし、これは、アレイ内の26個の要素を割り当てます。他の値はすべてゼロです。

あなたがこれを意味しないと仮定すると、D R HansonのC Interfaces and Implementationsをご覧ください。連想配列(別名ハッシュまたは辞書)を実装する方法を示しています。

+0

C99の素晴らしいレッスンですが、この構文はわかりませんでした。 – Steve314

1

libghthashを汎用ハッシュに使用することもできます。それらは非常に使いやすく、アプリケーションに組み込むことができます。ただし、サードパーティ製のAPIです。問題が発生した場合は、独自のAPIを実装する必要があります。

T hash[] = { 
    [1] = tObj, 
    [255] = tObj2, 
}; 
0

することができます:C.

配列の初期化(C99)で連想配列/ハッシュテーブルに内蔵されていないあります

は、おそらくあなたは、数値以外のキーを持っていない限り行くための最良の方法ですclibライブラリの一部として実装されているmapを使用してください。

関連する問題