2013-03-06 13 views
10

私はC++標準ライブラリを読んでいます:チュートリアルと参考書。連想配列の意味は何ですか?

typedef map<string,float> StringFloatMap; 
    StringFloatMap coll; 

    //insert some elements into the collection 
    coll["VAT"] = 0.15; 
    coll["Pi"] = 3.1415; 
    coll["an arbitrary number"] = 4983.223; 
    coll["Null"] = 0; 

著者は言う:マップの例では

をここで、インデックスは、キーとして使用され、任意の型を有することができます。これは連想配列のインターフェースです。連想配列は、インデックスが任意のタイプの配列である配列です。

いずれかが私に説明できます。任意のタイプは連想配列を意味しますか?

+2

これは、_any_を意味します。 'int'をキーとして、' std :: string'(あなたの例のように)、あるいはクラスのインスタンスさえ使って 'std :: map'を作成することができます。 –

+1

[dictionary.com](http://dictionary.reference.com/browse/arbitrary?s=t)から「任意:特定の値が割り当てられていません」、基本的にインデックスは何でもかまいません。文字列、整数、オブジェクト... – jonhopkins

+0

Josuttisがこの「**任意の」タイプ**に課された要件を説明するために続いたと思いますか? –

答えて

7

アレイは一般的に要素の位置によってインデックスが付けられます。単純な配列 - int x[10]は、その要素がx[0] ... x[9]です。インデックスは符号なし整数値です。

連想コンテナは、インデックスが、任意の(必ずしも符号なし整数ではない)タイプ(この場合はstd::string)であることを意味します。

2

区別はほとんどの人がシーケンスコンテナを呼び出すことになるベクトル/アレイの間であるが、実際のキーが

0からNまでの整数の完全な範囲であると 連想コンテナとみなすことができます

一方、マップはキーにそのような制限を設けません。文字列、整数、任意のタイプ(このタイプには等価比較演算子が存在することが条件です)があります。

+0

'' map [0] 'と' map [1000] 'は2つのオブジェクトを割り当てますが、' n>ベクトルなら 'vector [n]'を使うのは未定義の振る舞いです。 size() ' – FredericS

+0

C++のmap :: operator []の自動作成セマンティクスは、私の謙虚な意見でコンテナの理論的な分類とは何も関係ありません。 – us2012

+0

私のポイント(「完全な範囲」と言います)は、任意の**キー**をベクトルの_sequence_だけで使用することはできないので、私はそれを連想コンテナと見なしません。 – FredericS

2

これは、任意のキータイプと任意の値タイプを一致させるマップを作成できることを意味します。

あなたはYourClass ESまたはYetAnotherClassからYourOtherClassfloat秒、short秒にstd::string秒をマッピングするマップを作成することができます。

ポインタを他のポインタにマップできるstd::map<void *, void *>を作成することもできます。これは疑わしい使用ですが、ポインタが指しているデータのタイプを見つける方法がないためです。