範囲ベース 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++でデータのコレクションを処理するための汎用性の高いツールとなります。
チャレンジ
簡単都市名のコレクションを処理し、それぞれの文字数とともに表示することで、範囲ベースの for ループを実演するプログラムを作成してください。
以下の入力が提供されます:
- 都市の数を表す整数
n - その後に続く、都市名を表す
n個の文字列
プログラムは以下の手順で行ってください:
citiesという名前のstd::vector<std::string>を作成しますpush_back()を使用して、n個の各都市名をベクトルに追加します- 範囲ベースの for ループを使用して、ベクトルを反復処理します
- ループ内の各都市について、都市名に続けて
.length()メソッドを使用したその長さを出力します - ループの後、ベクトルの
.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() を使用してください。
チートシート
範囲ベースの for ループは、手動のインデックス管理なしでコンテナ内を反復処理します:
std::vector<std::string> names = {"Alice", "Bob", "Charlie"};
for (const std::string& name : names) {
std::cout << name << std::endl;
}&はnameを各要素への参照(エイリアス)として宣言します — コピーは発生しませんconstはループ本体内での要素の誤った変更を防ぎます- イテレーションをサポートする任意のコンテナで使用できます
自分で試してみよう
#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;
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。