連想配列とは、キー(鍵)とデータを組み合わせて格納する特殊なデータ構造です。
データを探索する際に「キー」を使って探します。
「キー」は数値だけでなく文字列なども指定出来ます。
連想配列の特徴を書きます。
・添え字(キー)によるアクセスが可能 イテレータによるアクセスも可 ・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に「データ」が入っています。
スタック以降は使い方の説明になりましたが、様々なデータ構造を知っておくだけでもプログラムの幅が拡がります。
その状況に合ったデータ構造が選択出来るよう、色々考えながら使ってみてください。