C++でマップを反復処理する方法

  1. while ループを使って std::map 要素を反復処理する
  2. 従来の for ループを用いた std::map 要素の反復処理する
  3. 範囲ベースの for ループを用いた std::map 要素の反復処理
  4. 範囲ベースの for ループを使用して std::map キーと値のペアを反復処理する

この記事では、C++で map を複数のメソッドを使って反復処理する方法を説明します。

while ループを使って std::map 要素を反復処理する

まず、一時的なマップ構造体 tempMap を定義し、任意のキーと値のペアで埋めます。

#include <iostream>
#include <map>

using std::cout;
using std::cin;
using std::endl;
using std::string;
using std::map;

int main() {
    map<int, string> tempMap = {{1, "Apple",},
                                {2, "Banana",},
                                {3, "Mango",},
                                {4, "Raspberry",},
                                {5, "Blackberry",},
                                {6, "Cocoa",}};

    auto iter = tempMap.begin();
    while (iter != tempMap.end()) {
        cout << "[" << iter->first << ","
                    << iter->second << "]\n";
        ++iter;
    }
    cout << endl;
    return 0;
}

出力:

[1,Apple]
[2,Banana]
[3,Mango]
[4,Raspberry]
[5,Blackberry]
[6,Cocoa]

型指定子 auto を用いて std::map のイテレータを宣言していることに注意してください。これは map<int, string>::iterator であり、明示的に指定することができます。

従来の for ループを用いた std::map 要素の反復処理する

さて、同じループを従来の for 反復で実装してみましょう。

#include <iostream>
#include <map>

using std::cout;
using std::cin;
using std::endl;
using std::string;
using std::map;

int main() {
    map<int, string> tempMap = {{1, "Apple",},
                                {2, "Banana",},
                                {3, "Mango",},
                                {4, "Raspberry",},
                                {5, "Blackberry",},
                                {6, "Cocoa",}};

    for (auto iter = tempMap.begin(); iter != tempMap.end(); ++iter){
        cout << "[" << iter->first << ","
                    << iter->second << "]\n";
    }
    cout << endl;
    return 0;
}

範囲ベースの for ループを用いた std::map 要素の反復処理

範囲ベースのループは、しばらくの間 C++ プログラマの間では一般的な選択肢となっています。お使いのコンパイラが C++11 バージョンをサポートしている場合は、従来の面倒なループはもう考えずに、以下の例の優雅さをお楽しみください。

#include <iostream>
#include <map>

using std::cout;
using std::cin;
using std::endl;
using std::string;
using std::map;

int main() {
    map<int, string> tempMap = {{1, "Apple",},
                                {2, "Banana",},
                                {3, "Mango",},
                                {4, "Raspberry",},
                                {5, "Blackberry",},
                                {6, "Cocoa",}};

    for (const auto &item : tempMap) {
        cout << "[" << item.first << "," << item.second << "]\n";
    }
    cout << endl;
    return 0;
}

範囲ベースの for ループを使用して std::map キーと値のペアを反復処理する

このバージョンは C++17 標準から定義されており、連想コンテナ内での反復処理をより柔軟に行えるようになっています。このメソッドのこれまでの例と比較した主な利点は、map 構造体内のキー値へのアクセスが便利であることで、プログラマにとっても読みやすさが向上します。

#include <iostream>
#include <map>

using std::cout;
using std::cin;
using std::endl;
using std::string;
using std::map;

int main() {
    map<int, string> tempMap = {{1, "Apple",},
                                {2, "Banana",},
                                {3, "Mango",},
                                {4, "Raspberry",},
                                {5, "Blackberry",},
                                {6, "Cocoa",}};

    for (const auto& [key, value] : tempMap) {
        cout << "[" << key << "," << value << "]\n";
    }
    cout << endl;
    return 0;
}
comments powered by Disqus