C++ での範囲ベースの for ループ

胡金庫 2023年10月12日
  1. C++ で範囲ベースの for ループを使って std::map の要素を表示する
  2. C++ でレンジベースの for ループを使って struct のメンバーを表示する
C++ での範囲ベースの for ループ

この記事では、C++ で範囲ベースの for ループを使用する方法に関する複数の方法を示します。

C++ で範囲ベースの for ループを使って std::map の要素を表示する

範囲ベースの for ループは、通常の for ループと同等の読みやすいものです。配列または begin および end メンバー関数を持つその他のオブジェクトをトラバースするために使用できます。auto キーワードと要素への参照を使用してアクセスすることに注意してください。この場合、itemstd::map の単一要素を指し、これはたまたまタイプ std::pair です。したがって、キーと値のペアにアクセスするには、first/second キーワードを使用してアクセスするために特別なドット表記が必要です。

#include <iostream>
#include <map>

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

int main() {
  map<int, string> fruit_map = {{
                                    1,
                                    "Apple",
                                },
                                {
                                    2,
                                    "Banana",
                                },
                                {
                                    3,
                                    "Mango",
                                },
                                {
                                    4,
                                    "Cocoa",
                                }};

  for (auto &item : fruit_map) {
    cout << "[" << item.first << "," << item.second << "]\n";
  }

  return EXIT_SUCCESS;
}

出力:

[1,Apple]
[2,Banana]
[3,Mango]
[4,Cocoa]

あるいは、範囲ベースのループは、構造化バインディング表記を使用して要素にアクセスし、コードブロックをより簡潔にすることができます。次の例では、std::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> fruit_map = {{
                                    1,
                                    "Apple",
                                },
                                {
                                    2,
                                    "Banana",
                                },
                                {
                                    3,
                                    "Mango",
                                },
                                {
                                    4,
                                    "Cocoa",
                                }};

  for (const auto& [key, val] : fruit_map) {
    cout << "[" << key << "," << val << "]\n";
  }

  return EXIT_SUCCESS;
}

出力:

[1,Apple]
[2,Banana]
[3,Mango]
[4,Cocoa]

C++ でレンジベースの for ループを使って struct のメンバーを表示する

構造化バインディングは、トラバースされた要素が複数のデータメンバーを持つ比較的大きな構造を表す場合に非常に役立ちます。次のサンプルコードに示すように、これらのメンバーは識別子リストとして宣言され、struct.member 表記なしで直接参照されます。ほとんどの STL コンテナは、範囲ベースの for ループを使用してトラバースできることに注意してください。

#include <iostream>
#include <list>

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

struct Person {
  string name;
  string surname;
  int age;
};

int main() {
  list<Person> persons = {{"T", "M", 11},
                          {"R", "S", 23},
                          {"J", "R", 43},
                          {"A", "C", 60},
                          {"D", "C", 97}};

  for (const auto& [n, s, age] : persons) {
    cout << n << "." << s << " - " << age << " years old" << endl;
  }

  return EXIT_SUCCESS;
}

出力:

T.M - 11 years old
R.S - 23 years old
J.R - 43 years old
A.C - 60 years old
D.C - 97 years old
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Loop