範囲ベース for ループ
CoddyのC++ジャーニー「論理と制御フロー」セクションの一部。レッスン 15/56。
インデックスを使う従来の for loop は vector を iterate するのに適していますが、C++ にはより洗練された解決策があります。それが range-based for loop です。この現代的な構文により、手動でのインデックス管理が不要になり、コードがよりすっきりして読みやすくなります。
範囲ベースの for loop は、反復処理の詳細を自動的に処理します。インデックス変数を管理する代わりに、各要素に対して何を行いたいかを指定するだけです:
std::vector<std::string> names = {"Alice", "Bob", "Charlie"};
for (const std::string& name : names) {
std::cout << name << std::endl;
}この loop は従来のインデックスベースのアプローチとまったく同じことを行いますが、構文ははるかにシンプルです。name 変数には、vector 内の各要素の値が一度に 1 つずつ自動的に代入されます。
ループ宣言の中にある & 記号、つまり const std::string& name に気づくかもしれません。この文脈では、& は以前に見たことがあるかもしれない「アドレス」を意味しません。ここでは、name を vector 内の各要素への参照(エイリアス)として直接宣言しており、そのコピーを作成しているわけではありません。同じデータに新しい名前を付けるようなものだと考えてください。これは要素へのポインターを using する場合と似ていますが、loop 本体の中でデリファレンスする必要はありません。
const キーワードは安全対策です。ループ本体内のエイリアスを通じて要素を誤って変更するのを防ぎます。エイリアス自体は、反復するたびに次の新しい要素へ進みます。一定に保たれるのは、エイリアスを通じてアクセスしている内容であり、ループの進行ではありません。
範囲ベースの for ループは、読みやすいだけでなく、より安全でもあります。インデックスを手動で管理しないため、インデックスエラーが発生するリスクがありません。これは反復処理をサポートするあらゆるコンテナで機能するため、C++でデータのコレクションを処理するための汎用性の高いツールです。
チャレンジ
簡単Create で、都市名のコレクションを処理し、各都市名とその characters の数を表示する range-based for loop を実演するプログラムを作成してください。
次の入力が提供されます。
- 都市の number を表す整数
n - Then、都市名を表す
n個の string
プログラムでは、次の処理を行ってください。
citiesという名前のstd::vector<std::string>を Create するpush_back()を使用して、n個の都市名を each vector に add する- range-based for loop を使用して vector through を iterate する
- loop 内の各都市について、都市名に続けて
.length()method を使用してその length を Print する - loop の After、vector の
.size()method を using して、processed された都市の total number を Print する
次の exact output format を使用してください。
City: [city name] (Length: [number of characters])\nCity: [city name] (Length: [number of characters])\n...\nTotal cities processed: [total count]range-based for loop では、vector 内の each element を iterate するために、構文 for (const std::string& city : cities) を使用してください。各都市名の characters の number を取得するには、city.length() を使用してください。
自分で試してみよう
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main() {
// 都市の数を読み取る
int n;
cin >> n;
// 都市名を格納するベクトルを作成する
vector<string> cities;
// 都市名を読み取り、ベクトルに追加する
for (int i = 0; i < n; i++) {
string city;
cin >> city;
cities.push_back(city);
}
// TODO: 以下にコードを書いてください
// 範囲ベースのforループを使用してcitiesベクトルを反復処理する
// 指定された形式で各都市とその長さを出力する
// After the loop, print the total number of cities processed
return 0;
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
論理と制御フローのすべてのレッスン
自分で練習してみよう: C++オンラインコンパイラ