C ++順不同マップの使用方法

How Use C Unordered Map



連想配列とも呼ばれるマップは、要素のリストであり、各要素はキーと値のペアです。したがって、各キーは値に対応します。通常の作業では、異なるキーが同じ値を持つことができます。たとえば、キーは果物のリストとそれに対応する値、果物の色にすることができます。 C ++では、マップはメンバー関数と演算子を含むデータ構造として実装されます。順序付けされたマップは、要素のペアがキーによって順序付けられているマップです。順序付けられていないマップは、順序がないマップです。この記事では、unordered_mapとして記述されたC ++の順序なしマップの使用方法について説明します。この記事を理解するには、C ++ポインターに関する知識が必要です。 unordered_mapは、C ++標準ライブラリの一部です。

クラスとオブジェクト

クラスは、一緒に機能する変数と関数のセットであり、変数には値が割り当てられていません。変数に値が割り当てられると、クラスはオブジェクトになります。同じクラスに異なる値を指定すると、オブジェクトも異なります。つまり、異なるオブジェクトは、異なる値を持つ同じクラスです。クラスからオブジェクトを作成することは、オブジェクトをインスタンス化すると言われています。







名前、 unordered_mapは、クラスです。 unordered_mapクラスから作成されたオブジェクトには、プログラマーが選択した名前が付いています。



クラスからオブジェクトをインスタンス化するには、クラスに属する関数が必要です。 C ++では、その関数の名前はクラスの名前と同じです。クラスから作成(インスタンス化)されたオブジェクトには、プログラマーによって異なる名前が付けられています。



クラスからオブジェクトを作成するということは、オブジェクトを作成することを意味します。また、インスタンス化することも意味します。





unordered_mapクラスを使用するC ++プログラムは、ファイルの先頭にある次の行から始まります。

#含む
#含む
名前空間stdを使用する;

最初の行は入出力用です。 2行目は、プログラムがunordered_mapクラスのすべての機能を使用できるようにすることです。 3行目では、プログラムが標準の名前空間の名前を使用できるようにします。



関数のオーバーロード

2つ以上の異なる関数シグネチャが同じ名前を持っている場合、その名前はオーバーロードされていると言われます。 1つの関数が呼び出されると、引数の数とタイプによって、実際に実行される関数が決まります。

構築/コピー構築

シンプルな構造

順序付けされていないマップは、次のように作成して値を割り当てることができます。

unordered_map<const char*、 const char*>umap;

umap['バナナ'] = '黄';
umap['葡萄'] = '緑';
umap['図'] = '紫の';

宣言は、キーと値のペアのタイプを使用したテンプレートの特殊化から始まります。この後に、プログラマーが選択したマップの名前が続きます。次にセミコロン。 2番目のコードセグメントは、キーに値を割り当てる方法を示しています。
Initializer_listによる構築
これは次のように実行できます。

unordered_map<const char*、 const char*>umap(({{{{'バナナ' '黄'}
{{'葡萄' '緑'} {{'図' '紫の'}})。;

Initializer_listを割り当てることによる構築
例:

unordered_map<const char*、 const char*>umap= {{{{'バナナ' '黄'}
{{'葡萄' '緑'} {{'図' '紫の'}};

別のunordered_mapをコピーして構築する
例:

unordered_map<const char*、 const char*>umap1(({{{{'バナナ' '黄'}
{{'葡萄' '緑'} {{'図' '紫の'}})。;
unordered_map<const char*、 const char*>umap2((umap1)。;

ペア要素

次のコードは、ペア要素を作成してアクセスする方法を示しています。

ペア<char const char*>pr= {{'NS' 'なれ'};
費用<<pr。初め << 'NS';
費用<<pr。2番目 << 'NS';

出力は次のとおりです。

NS
なれ

1番目と2番目は、ペアの2つのアイテムの予約語です。ペアの値は、firstとsecondを使用して変更できます。

順序付けされていないマップのトピックでは、ペアはvalue_typeと呼ばれます。

unordered_map要素アクセス

maps_type&operator [](key_type && k)
対応するキーの値を返します。例:

unordered_map<const char*、 const char*>umap;

umap['バナナ'] = '黄';
umap['葡萄'] = '緑';
umap['図'] = '紫の';

const char *=umap['葡萄'];

費用<<<<'NS';

出力は次のとおりです。緑。値は同じ方法で割り当てることができます-上記を参照してください。

unordered_map容量

size_type size()const noexcept
マップ内のペアの数を返します。

unordered_map<const char*、 const char*>umap;

umap['バナナ'] = '黄';
umap['葡萄'] = '緑';
umap['図'] = '紫の';

費用<<umap。サイズ(()。 <<'NS';

出力は3です。

bool empty()const noexcept

マップにペアがない場合はtrueの場合は1を返し、ペアがある場合はfalseを返します。例:

unordered_map<const char*、 const char*>umap;
費用<<umap。空の(()。 <<'NS';

出力は1です。

イテレータと順序付けられていないマップクラスを返す

イテレータはポインタに似ていますが、ポインタよりも多くの機能を備えています。

begin()noexcept

次のコードセグメントのように、マップオブジェクトの最初のペアを指すイテレータを返します。

unordered_map<const char*、 const char*>umap;

umap['バナナ'] = '黄';umap['葡萄'] = '緑';umap['図'] = '紫の';

unordered_map<const char*、 const char*> :::イテレータiter=umap。始める(()。;
ペア<const char*、 const char*>pr= *iter;
費用<<pr。初め << '、' <<pr。2番目 << 'NS';

出力は次のとおりです。イチジク、紫。マップは順序付けられていません。

begin()const noexcept;

マップオブジェクトコレクションの最初の要素を指すイテレータを返します。オブジェクト構築の前にconstが付いている場合、式begin()constがbegin()の代わりに実行されます。この状態では、オブジェクト内の要素を変更することはできません。たとえば、次のコードで使用されます。

constunordered_map<const char*、 const char*>umap(({{{{'バナナ' '黄'}
{{'葡萄' '緑'} {{'図' '紫の'}})。;

unordered_map<const char*、 const char*> :::const_iteratoriter=umap。始める(()。;
ペア<const char*、 const char*>pr= *iter;
費用<<pr。初め << '、' <<pr。2番目 << 'NS';

出力は次のとおりです。イチジク、紫。マップは順序付けられていません。今回は、返されたイテレータを受け取るために、イテレータだけでなくconst_iteratorが使用されていることに注意してください。

end()noexcept

マップオブジェクトの最後の要素のすぐ先を指すイテレータを返します。

end()const noexcept

マップオブジェクトの最後の要素のすぐ先を指すイテレータを返します。マップオブジェクトの構築の前にconstが付いている場合、end()の代わりに式end()constが実行されます。

unordered_map操作

イテレータfind(const key_type&k)

マップ内の指定されたキーのペアを検索します。見つかった場合は、イテレータを返します。見つからない場合は、ペアではないマップの終わりを指すイテレータを返します。次のコードは、このメンバー関数の使用方法を示しています。

unordered_map<charchar>>umap;

umap['に'] = 'NS';umap['NS'] = 'NS';umap['と'] = 'NS';

unordered_map<charchar> ::イテレータiter=umap。探す(('NS')。;
もしも ((umap。探す(('NS')。 !=umap。終わり(()。)。
{{
ペア<charchar>>pr= *iter;
費用<<pr。初め << '、' <<pr。2番目 << 'NS';
}

出力は次のとおりです:c、d

const_iterator find(const key_type&k)const;

このバージョンの関数は、順序付けられていないマップの作成がconstで始まる場合に呼び出され、マップのすべての要素を読み取り専用にします。

unordered_map修飾子

ペア挿入(value_type && obj)
順序付けられていないマップは、ペアが順序付けされていないことを意味します。したがって、プログラムは、都合のよい場所にペアを挿入します。関数はペアを返します。挿入が成功した場合、boolはtrueの場合は1になり、そうでない場合はfalseの場合は0になります。挿入が成功すると、イテレータは新しく挿入された要素を指します。次のコードは、使用法を示しています。

unordered_map<const char*、 const char*>umap;

umap['バナナ'] = '黄';
umap['葡萄'] = '緑';
umap['図'] = '紫の';

umap。入れる(({{{{'チェリー' 'ネット'} {{'いちご' 'ネット'}})。;

費用<<umap。サイズ(()。 << 'NS';

出力は次のとおりです。5。複数のペアを挿入できます。

size_typeerase(const key_type&k)

この関数は、unordered_mapからペアを消去します。次のコードセグメントは、次のことを示しています。

unordered_map<const char*、 const char*>umap;

umap['バナナ'] = '黄';
umap['葡萄'] = '緑';
umap['図'] = '紫の';

int1つに=umap。消去(('葡萄')。;

費用<<umap。サイズ(()。 << 'NS';

出力は2です。
void swap(unordered_map&)
このコードセグメントに示すように、2つの順序付けられていないマップを交換できます。

unordered_map<const char*、 const char*>umap1= {{{{'バナナ' '黄'}
{{'葡萄' '緑'} {{'図' '紫の'} {{'いちご' 'ネット'}};

unordered_map<const char*、 const char*>umap2= {{{{'チェリー' 'ネット'} {{'ライム' '緑'}};

umap1。スワップ((umap2)。;

unordered_map<const char*、 const char*> :::イテレータiter1=umap1。始める(()。;
ペア<const char*、 const char*>pr1= *iter1;
unordered_map<const char*、 const char*> :::イテレータiter2=umap2。始める(()。;
ペア<const char*、 const char*>pr2= *iter2;

費用<< 'umap1の最初のキーとサイズ:'<<pr1。初め <<'、'<<umap1。サイズ(()。 << 'NS';
費用<< 'umap2の最初のキーとサイズ'<<pr2。初め <<'、'<<umap2。サイズ(()。 << 'NS';
unordered_map<const char*、 const char*>umap1= {{{{'バナナ' '黄'}
{{'葡萄' '緑'} {{'図' '紫の'} {{'いちご' 'ネット'}};
unordered_map<const char*、 const char*>umap2= {{{{'チェリー' 'ネット'} {{'ライム' '緑'}};

umap1。スワップ((umap2)。;

unordered_map<const char*、 const char*> :::イテレータiter1=umap1。始める(()。;
ペア<const char*、 const char*>pr1= *iter1;
unordered_map<const char*、 const char*> :::イテレータiter2=umap2。始める(()。;
ペア<const char*、 const char*>pr2= *iter2;

費用<< 'umap1の最初のキーとサイズ:'<<pr1。初め <<'、'<<umap1。サイズ(()。 << 'NS';
費用<< 'umap2の最初のキーとサイズ'<<pr2。初め <<'、'<<umap2。サイズ(()。 << 'NS';

出力は次のとおりです。

umap1の最初のキーとサイズ:ライム、2

umap2イチゴの最初のキーとサイズ、4

マップは順序付けられていません。マップの長さは必要に応じて長くなることに注意してください。データ型は同じである必要があります。

クラスとそのインスタンス化されたオブジェクト

インスタンス化されたオブジェクトはクラスに対するものであるため、値はデータ型に対するものです。順序付けられていないマップ構築では、クラスをデータ型として受け入れることもできます。次のプログラムはこれを示しています。

#含む
#含む
名前空間stdを使用する;

クラスTheCla
{{
公衆
int1つに;
静的 charch;

空所関数((char番号 const char *NS)。
{{
費用<< 'がある ' <<1つに<< 「価値のある本」 <<番号<<NS<< ' お店で。' << 'NS';
}
静的 空所楽しい((charch)。
{{
もしも ((ch== 'に')。
費用<< 「公式静的メンバー関数」 << 'NS';
}
};

int主要(()。
{{
TheCla obj1;TheCla obj2;TheCla obj3;TheCla obj4;TheCla obj5;

unordered_map<const char*、TheCla>>umap;
umap= {{{{'バナナ'obj1} {{'葡萄'obj2} {{'図'obj3} {{'いちご'obj4} {{'ライム'obj5}};

費用<<umap。サイズ(()。 << 'NS';

戻る 0;
}

出力は次のとおりです:5。

クラス定義には、2つのデータパブリックメンバーと2つのパブリックメンバー関数があります。 main()関数では、クラスのさまざまなオブジェクトがインスタンス化されます。次に、順序付けされていないマップがインスタンス化されます。各ペアは、フルーツの名前とクラスのオブジェクトで構成されます。地図のサイズが表示されます。プログラムは警告やエラーメッセージなしでコンパイルされます。

地図の適用

配列はインデックスを値に関連付けます。キーと値のペアは、プログラム可能な生活の多くの状況に存在します。果物/色のキー/値のペアはほんの一例です。もう1つの例は、人の名前とその年齢です。この場合、ペアはタイプ、ペアになります。ペアにすることもできます。後者の場合、前処理ディレクティブが使用されます。キーと値のペアは、引き続き夫婦の名前にすることができます。一夫多妻制がある国では、一人の男性に異なる妻がいます。

マップの形成

マップは、2つの列を持つ2次元配列ではありません。マップはハッシュ関数で機能します。キーはハッシュ関数によって配列の整数にエンコードされます。値を保持するのはこの配列です。したがって、実際には値を持つ配列が1つあり、キーは配列のインデックスにマップされるため、キーと値の間の対応が行われます。ハッシュは広範なトピックであり、この記事では取り上げていません。

結論

連想配列とも呼ばれるマップは、要素のリストであり、各要素はキーと値のペアです。したがって、各キーは値に対応します。 C ++では、マップはメンバー関数と演算子を含むデータ構造として実装されます。順序付けされたマップは、要素のペアがキーによって順序付けられているマップです。順序付けされていないマップは、順序付けがないマップです。

技術的には、ハッシュはペア要素で構成されます。実際、このペアは、メンバー関数と演算子を含むデータ構造全体です。ペアの2つのテンプレートパラメータは、unordered_mapの同じ2つのテンプレートパラメータです。

マップのinitializer_listは、リテラルの配列リテラルです。各内部リテラルは、キーと値のペアの2つのオブジェクトで構成されます。

unordered_mapのメンバー関数と演算子は、unordered_map構築/コピー構築、unordered_map容量、unordered_mapイテレーター、unordered_map操作、およびunordered_map修飾子の見出しに分類できます。

キーを値にマップする必要がある場合は、順序付けされていないマップが使用されます。

Chrys