Menu
Coddy logo textTech

範囲ベース for ループ

CoddyのC++ジャーニー「論理と制御フロー」セクションの一部 — レッスン 15/56。

インデックスを使用した従来の for ループはベクターの反復処理に適していますが、C++ はより洗練されたソリューション、つまり範囲ベースの for ループを提供しています。このモダンな構文により、手動でのインデックス管理が不要になり、コードがよりクリーンで読みやすくなります。

範囲ベースのforループは、イテレーションの詳細を自動的に処理します。インデックス変数を管理する代わりに、各要素に対して行いたいことを指定するだけです:

std::vector<std::string> names = {"Alice", "Bob", "Charlie"};

for (const std::string& name : names) {
    std::cout << name << std::endl;
}

このループは、従来のインデックスベースのアプローチとまったく同じことを行いますが、構文はずっとシンプルです。name変数は、ベクター内の各要素の値を一度に1つずつ自動的に取得します。

ループ宣言の中に & 記号があることに気づくかもしれません — const std::string& name。この文脈では、& は以前に見たことがあるかもしれない「アドレス」を意味するものではありません。ここでは、name をベクター内の各要素へのコピーを作成するのではなく、直接的な参照(エイリアス)として宣言しています。同じデータに新しい名前を付けるようなものだと考えてください。要素へのポインタを使用するのと似ていますが、ループ本体の中でデリファレンス(参照剥がし)を行う必要はありません。

constキーワードは安全策です。ループ本体内のエイリアスを通じて誤って要素を変更してしまうのを防ぎます。エイリアス自体は、反復ごとに新しい要素へと進みます。定数として保持されるのは、ループの進行ではなく、エイリアスを通じてアクセスしている内容です。

範囲ベースのforループは、可読性が高いだけでなく、より安全でもあります。インデックスを手動で管理する必要がないため、インデックスエラーのリスクがありません。これはイテレーションをサポートするあらゆるコンテナで動作するため、C++でデータのコレクションを処理するための汎用性の高いツールとなります。

challenge icon

チャレンジ

簡単

都市名のコレクションを処理し、それぞれの文字数とともに表示することで、範囲ベースの for ループを実演するプログラムを作成してください。

以下の入力が提供されます:

  • 都市の数を表す整数 n
  • その後に続く、都市名を表す n 個の文字列

プログラムは以下の手順で行ってください:

  1. cities という名前の std::vector<std::string> を作成します
  2. push_back() を使用して、n 個の各都市名をベクトルに追加します
  3. 範囲ベースの for ループを使用して、ベクトルを反復処理します
  4. ループ内の各都市について、都市名に続けて .length() メソッドを使用したその長さを出力します
  5. ループの後、ベクトルの .size() メソッドを使用して、処理された都市の総数を出力します

以下の正確な出力形式を使用してください:

City: [city name] (Length: [number of characters])\nCity: [city name] (Length: [number of characters])\n...\nTotal cities processed: [total count]

範囲ベースの for ループでは、for (const std::string& city : cities) という構文を使用してベクトルの各要素を反復処理する必要があります。各都市名の文字数を取得するには city.length() を使用してください。

自分で試してみよう

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main() {
    // 都市の数を読み込む
    int n;
    cin >> n;
    
    // 都市名を格納するためのvectorを作成する
    vector<string> cities;
    
    // 都市名を読み込み、vectorに追加する
    for (int i = 0; i < n; i++) {
        string city;
        cin >> city;
        cities.push_back(city);
    }
    
    // TODO: 以下にコードを記述してください
    // 範囲ベースのforループを使用してcities vectorを反復処理する
    // 指定された形式を使用して、各都市とその長さを出力する
    // ループの後、処理された都市の総数を出力する
    
    return 0;
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

論理と制御フローのすべてのレッスン