地図で見る C++ 標準テンプレート ライブラリ (STL)

マップとは何か C++? 構文

In C++ MAP マップされた形式で項目を格納する連想コンテナーです。 マップ内の各項目は、キーと値、およびマップされた値で構成されます。 XNUMX つのマップされた値は、同じキー値を共有できません。

キー値は、要素を並べ替えて一意に識別するのに適しています。 マップされた値は、キーに関連付けられたコンテンツを保存するためのものです。 両者はタイプが異なりますが、メンバータイプは両方を組み合わせたペアタイプを介して組み合わせます。

std::map を使用する理由

マップを使用する理由は次のとおりです。

  • std::map は、選択した並べ替え基準に基づいて並べ替えられた順序でのみ一意のキーを格納します。
  • キーを使用して要素を検索するのが簡単かつ迅速です。
  • 各キーにアタッチされる要素は XNUMX つだけです。
  • std::map は連想配列として使用できます。
  • std::map はバイナリ ツリー (バランス) を使用して実装できます。

構文

std::map を宣言するには、次の構文を使用します。

std::map<key_datatype, value_datatype>map_name; 
  • この key_datatype マップキーのデータ型を示します。
  • この value_datatype は、マップキーに対応する値のデータ型を示します。
  • この map_name マップの名前です。

例:

map<string, int> my_map; 

という名前のマップを宣言しました my_map。マップには次のような文字列が含まれます キー データ型と整数 データ・タイプ。

メンバーの種類

メンバー関数は、次のメンバー型をパラメーターまたは戻り値の型として使用できます。

  • キーの種類: キー (テンプレートの最初のパラメータ)
  • マップされたタイプ: T (テンプレートの XNUMX 番目のパラメータ)
  • キー比較: 比較 (テンプレートの XNUMX 番目のパラメーター)
  • アロケータのタイプ: Alloc (テンプレートの XNUMX 番目のパラメーター)
  • 値の種類: ペア
  • 値の比較: 要素を比較するためのネストされた関数クラス
  • 参照: allocator_type::reference
  • const_reference: allocator_type::const_reference
  • ポインタ: allocator_type::pointer
  • const_pointer: allocator_type::const_pointer
  • イテレータ: value_type への双方向反復子
  • const_iterator: const value_type への双方向イテレータ
  • reverse_iterator: 逆反復子
  • const_reverse_iterator: 定数逆反復子
  • 違いの種類: ptrdiff_t
  • サイズタイプ: サイズ_t

std::map の組み込み関数

std::map には組み込み関数が付属しています。 これらには次のようなものがあります。

  • 始める() - この関数は、マップの最初の項目への反復子を返します。
  • サイズ() -この関数は、マップ内のアイテムの数を返します。
  • 空の() -この関数は、マップが空かどうかを示すブール値を返します。
  • insert( ペア(キー, 値)) – この関数は、新しいキーと値のペアをマップに挿入します。
  • 検索(値) – この関数は、val 要素が見つかった場合にその反復子を渡します。見つからない場合は、m.end() を返します。
  • 消去 (反復子の位置) – この関数は、イテレータが指す位置にある項目を削除します。
  • 消去(const g) – この関数は、キーと値の g をマップから削除します。
  • クリア () -この関数は、マップからすべてのアイテムを削除します。

マップ要素の反復処理

マップ要素を反復処理できます。 イテレータを作成し、それを使用するだけです。
例:

例1:

#include <iostream>
#include <string>
#include <map> 

using namespace std;
int main() {

	map<int, string> Students;

	Students.insert(std::pair<int, string>(200, "Alice"));

	Students.insert(std::pair<int, string>(201, "John"));

	cout << "Map size is: " << Students.size() << endl;

	cout << endl << "Default map Order is: " << endl;

	for (map<int, string>::iterator it = Students.begin(); it != Students.end(); ++it) {

		cout << (*it).first << ": " << (*it).second << endl;
	}
}

出力:

マップ要素の反復処理

コードのスクリーンショットは次のとおりです。

マップ要素の反復処理

コードの説明:

  1. その機能を使用するには、iostream ヘッダー ファイルをコードに組み込みます。
  2. その関数を使用するには、文字列ヘッダー ファイルをコードに組み込みます。
  3. その機能を使用するには、マップ ヘッダー ファイルをコードに組み込みます。
  4. std 名前空間をコードに含めると、呼び出さずにそのクラスを使用できます。
  5. コー​​ル main() 関数。 { は関数本体の始まりを示します。
  6. Student という名前のマップを作成します。キーは整数、値は文字列になります。
  7. マップに値を挿入します。 キー 200 と値 Alice がマップに挿入されます。
  8. マップに値を挿入します。 キー 201 と値 John がマップに挿入されます。
  9. size() Student という名前のマップのサイズを取得する関数。これにより 2 が返されるはずです。
  10. コンソールにテキストを出力します。
  11. for ループを使用して it という名前の反復子を作成し、Students という名前のマップの要素を反復処理します。
  12. マップ Student の値をコンソールに出力します。
  13. for ループの本体の終わり。
  14. 本体の端 main() 機能。

std::map へのデータの挿入

を使用して項目を std::map に入力できます。 insert() 関数。 std::map キーは一意である必要があることに注意してください。

したがって、最初に各キーがマップ内に存在するかどうかを確認します。 存在する場合、エントリは挿入されませんが、既存のエントリのイテレータを返します。 存在しない場合は、エントリが挿入されます。

この機能には次のバリエーションがあります。

  • インサート(ペア) – このバリエーションでは、キーと値のペアがマップに挿入されます。
  • insert(start_itr, end_itr) – このバリエーションでは、エントリは別のマップの start_itr と end_itr で定義された範囲内に挿入されます。

この insert_or_assing() 関数は次と同じように動作します insert() ただし、指定されたキーがマップ内にすでに存在する場合、その値は変更されます。

例2:

#include <map>
#include <iostream>

using namespace std;

int main() {

	map<int, int> m{ {1,3} , {2,4} , {3,5} };

	m.insert({ 5, 6 });
	m.insert({ 1, 8 });

	m.insert_or_assign(1, 6);  
	
	cout << "Key\tElement\n";
	for (auto itr = m.begin(); itr != m.end(); ++itr) {
		cout << itr->first << '\t' << itr->second << '\n';
	}
	return 0;
}

出力:

std::map へのデータの挿入

コードのスクリーンショットは次のとおりです。

std::map へのデータの挿入

コードの説明:

  1. その機能を使用するには、マップ ヘッダー ファイルをコードに組み込みます。
  2. その機能を使用するには、iostream ヘッダー ファイルをコードに組み込みます。
  3. std 名前空間をコードに含めると、呼び出さずにそのクラスを使用できます。
  4. コー​​ル main() 関数。 { は関数本体の始まりを示します。
  5. m という名前のマップを作成します。キーは整数、値は整数になります。 マップには XNUMX つのエントリが作成されました。
  6. 新しいエントリをマップ m に挿入します。 キー 5 と値 6 がマップに挿入されます。
  7. 既存のキーにエントリを作成しようとしています。 キー 1 はマップ内にすでに存在するため、エントリは作成されません。
  8. 使い方 insert_or_assign() 既存のエントリを挿入または変更する関数。キー 1 はすでに存在するため、その値は 6 に変更されます。
  9. コンソールにテキストを出力します。 「\t」文字は水平方向のスペースを作成し、「\n」文字はマウス カーソルを次の行に移動します。
  10. 使用 forループ itr という名前の反復子を作成して、m という名前のマップの要素を反復処理します。
  11. マップ m の値をコンソールに出力します。 「\t」文字は、各キーとそれに対応する値の間に水平方向のスペースを作成します。 対照的に、「\n」文字は、反復のたびにマウス カーソルを次の行に移動します。
  12. for a ループの本体の終わり。
  13. プログラムは正常に完了すると値を返す必要があります。
  14. 本体の端 main() 機能。

マップで検索する

使用できます find() マップ内の要素をキーで検索する関数。キーが見つからない場合、関数は std::map::end を返します。それ以外の場合は、検索された要素の反復子が返されます。

例3:

#include <iostream>
#include <string>
#include <map> 
using namespace std;
int main() {
	map<int, string> Students;
	Students.insert(std::pair<int, string>(200, "Alice"));
	Students.insert(std::pair<int, string>(201, "John"));
	std::map<int, string>::iterator it = Students.find(201);
	if (it != Students.end()) {
		std::cout << endl << "Key 201 has the value: => "<< Students.find(201)->second << '\n';
	}
}

出力:

マップで検索する

コードのスクリーンショットは次のとおりです。

マップで検索する

コードの説明:

  1. エラーを発生させずに関数を使用するには、iostream ヘッダー ファイルをコードに組み込みます。
  2. エラーを発生させずにその関数を使用するには、文字列ヘッダー ファイルをコードに含めます。
  3. エラーを発生させずにその機能を使用するには、マップ ヘッダー ファイルをコードに組み込みます。
  4. std 名前空間をコードに含めると、呼び出さずにそのクラスを使用できます。
  5. コー​​ル main() 関数。 { は本文の始まりを示します main() 機能。
  6. Student という名前のマップを作成します。このマップのキーは整数、値は文字列になります。
  7. マップに値を挿入します。 キー 200 と値 Alice がマップに挿入されます。
  8. マップに値を挿入します。 キー 201 と値 John がマップに挿入されます。
  9. キー 201 に関連付けられた値を探します。
  10. if ステートメントを使用して、キーの値が見つかったかどうかを確認します。
  11. コンソール上のテキストの横にキーの値を出力します。
  12. if ステートメントの本文の終わり。
  13. 本体の端 main() 機能。

マップからのデータの削除

使用できます erase() マップから値を削除する関数。削除する要素を指すイテレータを作成するだけです。次に、反復子は erase() 機能。

例4:

#include <iostream>
#include <string>
#include <map>

using namespace std;
int main() {

	map<std::string, int> my_map;

	my_map.insert(std::make_pair("cow", 1));

	my_map.insert(std::make_pair("cat", 2));

	my_map["lion"] = 3;

	map<std::string, int>::iterator it = my_map.find("cat");

	my_map.erase(it);

	for (map<string, int>::iterator it = my_map.begin(); it != my_map.end(); ++it)

		cout << (*it).first << ": " << (*it).second << endl;

  return 0;
}

出力:

マップからのデータの削除

コードのスクリーンショットは次のとおりです。

マップからのデータの削除

コードの説明:

  1. その機能を使用するには、iostream ヘッダー ファイルをコードに組み込みます。
  2. その関数を使用するには、文字列ヘッダー ファイルをコードに組み込みます。
  3. その機能を使用するには、マップ ヘッダー ファイルをコードに組み込みます。
  4. std 名前空間をコードに含めると、呼び出さずにそのクラスを使用できます。
  5. コー​​ル main() 関数。 { は本文の始まりを示します。 main() 機能。
  6. my_map という名前のマップを作成します。このマップのキーは文字列、値は整数になります。
  7. マップ my_map に値を挿入します。 Cow のキーと 1 の値がマップに挿入されます。
  8. マップ my_map に値を挿入します。 Cat のキーと 2 の値がマップに挿入されます。
  9. ライオンのキーを使用して値 3 をマップ my_map に追加します。
  10. キー cat を探してマップ my_map を反復処理するイテレーターを作成します。
  11. イテレータが指す要素を削除します。
  12. イテレータを使用して、マップ my_map の要素を最初から最後まで反復処理します。
  13. マップ my_map の内容をコンソールに出力します。
  14. プログラムは正常に完了すると出力を返す必要があります。
  15. 本体の端 main() 機能。

まとめ

  • マップは、アイテムをマップされた形式で保存する連想コンテナです。
  • マップ内の各項目には、キー値とマップされた値があります。
  • マップでは、マップされた XNUMX つの値がキー値を共有することはできません。
  • キーの値は、要素を一意に並べ替えて識別するのに役立ちます。
  • マップされた値は、キーに関連付けられたコンテンツの保存に役立ちます。
  • C++ マップは一意のキーをソートされた順序で格納します。
  • で作業する C++ map では、要素を反復処理する反復子を作成します。
  • イテレータを使用すると、マップからアイテムを検索したり削除したりするなどのタスクを実行できます。