連想配列とは、キー(鍵)とデータを組み合わせて格納する特殊なデータ構造です。
データを探索する際に「キー」を使って探します。
「キー」は数値だけでなく文字列なども指定出来ます。
連想配列の特徴を書きます。
・添え字(キー)によるアクセスが可能 イテレータによるアクセスも可 ・insert関数によってデータを追加する (キーとデータをペアにして格納する) ・キーを指定する事で簡単にデータを探せる |
まずは、サンプルを作りましょう。
宣言部分のみ書きます。
<sample program cpp022-01>
#include <iostream> #include <map> #include <string> int main() { std::map<std::string, int> mapData; return 0; } |
これは、string型が「キー」でint型が「データ」になります。
次にinsert関数でデータを追加する方法を書きます。
<sample program cpp022-02>
#include <iostream> #include <map> #include <string> int main() { std::map<std::string, int> mapData; mapData.insert(std::make_pair("ABC", 15)); return 0; } |
データを追加する際にはペアで追加する必要があります。
std::make_pair("ABC", 15) |
ペアは、make_pairを使う事で簡単に作れます。
「キー」である文字列("ABC")と「データ」である整数(15)を組み合わせてinsert関数で追加します。
次に追加したデータを表示してみます。
<sample program cpp022-03>
#include <iostream> #include <map> #include <string> int main() { std::map<std::string, int> mapData; mapData.insert(std::make_pair("ABC", 15)); std::cout << mapData["ABC"] << std::endl; return 0; } |
<実行結果>
15 続行するには何かキーを押してください・・・
配列の添え字の部分に「キー」を指定する事で、データにアクセス出来ます。
次のようにデータを格納する事も出来ます。
<sample program cpp022-04>
#include <iostream> #include <map> #include <string> int main() { std::map<std::string, int> mapData; mapData.insert(std::make_pair("ABC", 15)); std::cout << mapData["ABC"] << std::endl; mapData["DEF"] = 25; std::cout << mapData["DEF"] << std::endl; return 0; } |
<実行結果>
15 25 続行するには何かキーを押してください・・・
直接、添え字に「キー」を指定してデータを格納しています。
ただし、この方法よりはinsert関数を使った方が良いと思います。
なぜかと言うと、setと同じくmapも重複データの格納が出来ないからです。
insert関数を使えば、結果が分かります。
サンプルを作ってみましょう。
<sample program cpp022-05>
#include <iostream> #include <map> #include <string> int main() { std::map<std::string, int> mapData; std::pair<std::map<std::string, int>::iterator, bool> result; result = mapData.insert(std::make_pair("ABC", 15)); if (result.second) { std::cout << "OK" << std::endl; } else { std::cout << "NG" << std::endl; } result = mapData.insert(std::make_pair("ABC", 15)); if (result.second) { std::cout << "OK" << std::endl; } else { std::cout << "NG" << std::endl; } return 0; } |
<実行結果>
OK NG 続行するには何かキーを押してください・・・
setのinsert関数と同じですね。
setと同じように、find関数もあります。
<sample program cpp022-06>
#include <iostream> #include <map> #include <string> int main() { std::map<std::string, int> mapData; mapData.insert(std::make_pair("ABC", 15)); mapData.insert(std::make_pair("DEF", 25)); mapData.insert(std::make_pair("GHI", 35)); if (mapData.find("DEF") != mapData.end()) { std::cout << "Find" << std::endl; } else { std::cout << "No Found" << std::endl; } return 0; } |
<実行結果>
OK NG 続行するには何かキーを押してください・・・
これもsetのfind関数と同じです。
最後にイテレータを使ったアクセス方法について説明します。
<sample program cpp022-07>
#include <iostream> #include <map> #include <string> int main() { std::map<std::string, int> mapData; mapData.insert(std::make_pair("GHI", 35)); mapData.insert(std::make_pair("DEF", 25)); mapData.insert(std::make_pair("ABC", 15)); std::map<std::string, int>::iterator it; for (it = mapData.begin(); it != mapData.end(); it++) { std::cout << "first = " << it->first << " : " << "second = " << it->second << std::endl; } return 0; } |
<実行結果>
first = "ABC" : second = 15 first = "DEF" : second = 25 first = "GHI" : second = 35 続行するには何かキーを押してください・・・
前のプログラムとは逆の順番でデータを格納しました。
実行結果を見ると、キーの昇順に表示されています。
また、イテレータはペアを指していますので、firstに「キー」secondに「データ」が入っています。
スタック以降は使い方の説明になりましたが、様々なデータ構造を知っておくだけでもプログラムの幅が拡がります。
その状況に合ったデータ構造が選択出来るよう、色々考えながら使ってみてください。