Map(STL)
出典: YKAwiki
連想配列、という言葉を聞いたことがありますか?
連想配列とは、通常の配列が要素の順番でしか要素を指定できない(hoge[3]みたいに)のに対して、あらかじめ対応付けておけば、文字列などで要素を指定できるもののことを言います(hoge["piyo"]で、何番目かは知らないけど"piyo"と名づけた要素が取り出せる)。ちょうど、配列が要素の名前を覚えていて、名前を与えるとあたかもその名前から連想して要素を取り出してきてくれるように見えるために「連想配列」と言うのです(たぶん)。
例えばPerlでは、すごく簡単に連想配列を使うことができますが、C++ではSTLという標準ライブラリを使わないと連想配列が使えません。連想配列は使い方によってはすっごく便利なので、STLを使う手間を惜しまないようにしましょう。
ここで注意なのですが、C++では連想配列のことをMapと言います(Map以外の連想配列もあると思いますが、それは自分で探してみてください)。要素の名前(キーと言います)と、要素の実体をマッピングしたもの、という意味でMapというのでしょう(たぶん)。というわけで、以下ではMapの使い方を説明します。
mapのインスタンスを宣言する
始めに必要なものをインクルードします。std::を省略するかどうかは個人の好みによりますが、ここでは簡単のためusingを使って省略させます(std::とusingのかんけいがよくわからないひとは、STLのごほんをよむか、まわりのおとなにきいてね! でもここではわからなくてももんだいないよ!)
#include <map> using namespace std;
map<string,string> pairList;
キーと、それに対応するデータの型を宣言します。これはint hoge;と同じような意味です。妙な<>がついていたりしますがこれはそういう書き方をするものなのだと割り切って慣れてください。「map<string,string>」で「stringでstringを連想するmap型」という意味を表しています。
mapに追加・mapから参照
pairList["piyo"]= string("hoge");
配列のように内容を設定することで追加できます。pairListという配列の中に、「piyo」と名づけた「hoge」という文字列の要素が加わったことになります。ややこしいですが、ややこしい先にラクが待っています。
参照は
cout<<pairList["piyo"]<<endl;
これでok。このケースではpairListからは「piyo」という文字列から「hoge」という文字列が出てくるはずなので、出力結果はめでたく
hoge
となるはずです。
mapをイテレータで巡る
ここからはイテレータを理解してからでないとつらいと思うので、イテレータを知らない人は出直してきてください。レベルが十分でないのにボス戦に挑むのは勇気ではなく無謀というものです。
マップコンテナの全ての要素にアクセスしたい場合、イテレータで巡るのが簡単です。 mapのイテレータはpairクラスという型で構成されており、キーがpair.first,データがpair.secondでアクセスできます。なんか構造体みたいですね。
map<string,string>::iterator it;
for( it = pairList.begin(); it != pairList.end(); it ++){
cout << "キー:" << (*it).first << " ,データ=" << (*it).second << endl;
}
itがインクリメントされることでpairListを走査できるわけです。itが実体の肩代わりもしているので、3行目のcout文のような書き方が可能です。
