パープルハット

※当サイトではGoogleアドセンス広告を利用しています

C++ mapの使い方



宣言

  • mapをインクルードする必要があります。
  • 宣言時に、KeyとValueの型を宣言する必要があります(例ではKeyがstring、Valueがint)。
#include <iostream>
#include <map>

int main() {
    std::map<std::string, int> mp;
}





追加と表示

mp[Key] = Value
とすれば、map型変数mpに対して

  • Keyが存在しない:新規作成
  • Keyが既に存在:上書き

を行ってくれます。

ソースコード

#include <iostream>
#include <map>

int main() {
    std::map<std::string, int> mp;

    mp["C"] = 5;
    mp["B"] = 18;
    mp["A"] = 4;
    mp["D"] = 6;

    std::cout << "key = A, Value = " << mp["A"] << std::endl;
    std::cout << "key = B, Value = " << mp["B"] << std::endl;
    std::cout << "key = C, Value = " << mp["C"] << std::endl;
    std::cout << "key = D, Value = " << mp["D"] << std::endl;
}

実行結果

key = A, Value = 4
key = B, Value = 18
key = C, Value = 5
key = D, Value = 6





for文での表示

(1) イテレータを使う場合

ソースコード

#include <iostream>
#include <map>

int main() {
    std::map<std::string, int> mp{
        {"A", 4},
        {"B", 18},
        {"C", 5},
        {"D", 6}
    };

    for (auto ite = mp.begin(); ite != mp.end(); ite++) {
        std::cout << "Key = " << ite->first << ", Value = " << ite->second << std::endl;
    }
}



(2) 範囲for文を使う場合

  • こちらの方がコードを短く書けます。

ソースコード

#include <iostream>
#include <map>

int main() {
    std::map<std::string, int> mp{
        {"A", 4},
        {"B", 18},
        {"C", 5},
        {"D", 6}
    };

    for (auto p : mp) {
        std::cout << "Key = " << p.first << ", Value = " << p.second << std::endl;
    }
}


実行結果

  • (1), (2)どちらでも同じ結果になります。
  • Keyの値で自動的に整列されているのでその順に表示されます。
Key = A, Value = 4
Key = B, Value = 18
Key = C, Value = 5
Key = D, Value = 6





要素数の表示(size)

vectorなどと同様にmp.size()とすることで要素数が表示できます。

ソースコード

#include <iostream>
#include <map>

int main() {
    std::map<std::string, int> mp;

    mp["C"] = 5;
    mp["B"] = 18;
    mp["A"] = 4;
    mp["D"] = 6;

    std::cout << "mp.size() = " << mp.size() << std::endl;
}

実行結果

mp.size() = 4





Keyの存在を検索

(1)findを使った方法

mp.find(Key) != mp.end()について、

  • true:Keyがある
  • false :Keyがない

とKeyの存在を調べることができます。

ソースコード

#include <iostream>
#include <map>

int main() {
    std::map<std::string, int> mp = {
      {"A", 4},
      {"C", 5}
    };

    //KeyにAがあるか 
    std::map<std::string, int>::iterator  ite = mp.find("A");
    if (ite != mp.end()) {
        std::cout << "Key = Aが存在" << std::endl;
    }
    else {
        std::cout << "Key = Aはない" << std::endl;
    }

    //KeyにWがあるか 
    if (mp.find("W") != mp.end()) {
        std::cout << "Key = Wが存在" << std::endl;
    }
    else {
        std::cout << "Key = Wはない" << std::endl;
    }
}

実行結果

Key = Aが存在
Key = Wはない



(2)containsを使った方法

mp.contains(Key)について、

  • true:Keyがある
  • false :Keyがない

と先ほどより短いコードでKeyの存在をチェックすることができます。
C++20以降の機能のようなので、コンパイラのバージョンに注意。

ソースコード

#include <iostream>
#include <map>

int main()
{
    std::map<std::string, int> mp = {
      {"A", 4},
      {"C", 5}
    };

    // KeyにAがあるか 
    if (mp.contains("A")) {
        std::cout << "Key = Aが存在" << std::endl;
    }
    else {
        std::cout << "Key = Aはない" << std::endl;
    }

    //KeyにWがあるか 
    if (mp.contains("W")) {
        std::cout << "Key = Wが存在" << std::endl;
    }
    else {
        std::cout << "Key = Wはない" << std::endl;
    }
}

実行結果

(1)と同じなため省略




指定した要素の削除(erase)

iterator指定でも、Key指定のどちらでも可。

#include <iostream>
#include <map>

int main() {
    std::map<std::string, int> mp;

    mp["C"] = 5;
    mp["B"] = 18;
    mp["A"] = 4;
    mp["D"] = 4;

    std::cout << "Aを削除して表示" << std::endl;
    mp.erase("A");
    for (auto ite = mp.begin(); ite != mp.end(); ite++) {
        std::cout << "Key = " << ite->first << ", Value = " << ite->second << std::endl;
    }
    std::cout << std::endl;


    std::cout << "Cを削除して表示" << std::endl;
    std::map<std::string, int>::iterator  ite = mp.find("C");
    mp.erase(ite);
    for (auto ite = mp.begin(); ite != mp.end(); ite++) {
        std::cout << "Key = " << ite->first << ", Value = " << ite->second << std::endl;
    }
    std::cout << std::endl;
}

実行結果

Aを削除して表示
Key = B, Value = 18
Key = C, Value = 5
Key = D, Value = 4

Cを削除して表示
Key = B, Value = 18
Key = D, Value = 4





空にする(clear)

mp.clear()で空にできる。

#include <iostream>
#include <map>

int main() {
    std::map<std::string, int> mp;

    mp["C"] = 5;
    mp["B"] = 18;

    mp.clear();
    std::cout << "clear後のsize = " << mp.size() << std::endl;
}

実行結果

clear後のsize = 0