HOWTO · C++

C++ でマップを繰り返し処理する方法

この記事では、STL マップデータ構造の要素をループする方法を示します。

このページの内容

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

while ループを使って std::map 要素を繰り返し処理する

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

#include <iostream>
#include <map>

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

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::cin;
using std::cout;
using std::endl;
using std::map;
using std::string;

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::cin;
using std::cout;
using std::endl;
using std::map;
using std::string;

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::cin;
using std::cout;
using std::endl;
using std::map;
using std::string;

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;
}