★連想配列(map)★


連想配列とは、キー(鍵)とデータを組み合わせて格納する特殊なデータ構造です。

データを探索する際に「キー」を使って探します。

「キー」は数値だけでなく文字列なども指定出来ます。


map基礎


連想配列の特徴を書きます。

・添え字(キー)によるアクセスが可能
 イテレータによるアクセスも可

・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に「データ」が入っています。


スタック以降は使い方の説明になりましたが、様々なデータ構造を知っておくだけでもプログラムの幅が拡がります。

その状況に合ったデータ構造が選択出来るよう、色々考えながら使ってみてください。


次へ

戻る

目次へ