普通の配列は、0から連続した整数を添え字として配列の要素にアクセスすることができます。それに対して、連想配列というのは、整数以外(例えば文字列)の値を添え字として要素にアクセスすることができます。C++では、std::mapクラステンプレートを使うことで簡単に連想配列を作ることができます。
次のサンプルでは、国名(文字列)を添え字(キー)として、その国の首都(文字列)を調べるための連想配列を作っています。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include <iostream> #include <map> int main() { std::map<std::string, std::string> capital; capital["日本"] = "東京"; capital["アメリカ"] = "ワシントンDC"; capital["トルコ"] = "イスタンブール"; capital["タイ"] = "クルンテープ・マハーナコーン・ポーウォーン・ラタナコーシン・マヒンタラーユタヤー・マハーディロクポップ・ノッパラッタナ・ラーチャターニー・プリーロム・ウドム・ラーチャニウェート・マハーサターン・アモーンピマーン・アワターンサティット・サッカティッティヤ・ウィサヌカム・プラシット"; std::cout << "国名を入力してください> "; std::cout.flush(); std::string country; std::cin >> country; std::cout << capital[country] << std::endl; return 0; } |
std::mapクラステンプレートは、テンプレート実引数として、キーの型と要素の型の順に指定します。
0 1 2 |
std::map<キーの型, 要素の型> |
キーの型は、代入と比較ができるものであればどんな型でもかまいません。比較ができない(関係演算子が定義されていない)型を使うこともできますが、その場合は比較用のファンクタを定義して、第3テンプレート引数として指定する必要があります。
0 1 2 |
std::map<キーの型, 要素の型, 比較用ファンクタの型> |
要素の型は代入可能なものであればどんな型でもかまいません。
ところで、std::mapの要素に配列添え字演算子[]でアクセスするためには、std::map型のオブジェクトがconst修飾されていてはいけません。これは、要素が見つからない場合、空の要素を自動的に連想配列に挿入するようになっているためです。
const修飾されたstd::mapの要素にアクセスするには、findメンバ関数を使う必要があります(詳細は割愛します)。なお、C++11からはatメンバ関数を使うこともできます。