vectorの反復処理:インデックス、範囲for、イテレーター
インデックスアクセス、範囲for、明示的なイテレーターでvectorを反復処理します。
「vectorの反復処理:インデックス、範囲for、イテレーター」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
反復処理の3つの方法
vector の要素は、次の方法で走査できます。
- インデックスベースの
for (size_t i = 0; i < v.size(); ++i) - 範囲ベースの
for (auto& x : v) - イテレーターを使う
for (auto it = v.begin(); it != v.end(); ++it)
インデックスベースのループ
C でおなじみの方法です。値と一緒にインデックスが必要な場合に便利です。
for (size_t i = 0; i < v.size(); ++i) {
std::cout << i << ": " << v[i] << "\n";
}size_t と int
size() は符号なしの size_t を返します。符号付きの int カウンターと混在させると、コンパイラーの警告や微妙なバグの原因になります。size_t または C++20 の std::ssize を使用してください。
範囲ベースの for
インデックスが不要な場合に最もすっきり書ける形式です。適切な参照修飾子を選択してください。
for (const auto& x : v) std::cout << x << " "; // read only
for (auto& x : v) x *= 2; // modify in placeイテレーター
イテレーターは汎用化されたポインターです。v.begin() は先頭の要素を指し、v.end() は末尾の要素の1つ先を指します。
for (auto it = v.begin(); it != v.end(); ++it) {
std::cout << *it << " ";
}const_iterator
要素を変更する必要がない場合は cbegin() と cend() を使用します。イテレーターの型は const_iterator です。
逆方向イテレーター
rbegin() と rend() を使うと、末尾から先頭の順に走査できます。参照外しで得られる要素は同じですが、順序が逆になります。
for (auto it = v.rbegin(); it != v.rend(); ++it) {
std::cout << *it << " ";
}イテレーター演算
vector のイテレーターはランダムアクセスイテレーターです。整数を加減算したり、< で比較したりできます。
auto it = v.begin();
it += 3; // skip 3 elements
std::cout << *it;アルゴリズムはイテレーターを使う
STL アルゴリズムはイテレーターのペアを受け取ります。std::sort や std::find のようなアルゴリズムに v.begin(), v.end() を渡してください。
#include <algorithm>
std::sort(v.begin(), v.end());
auto it = std::find(v.begin(), v.end(), 42);イテレーターが無効になる場合
vector に要素を追加すると、再割り当てが発生する場合があります。capacity が変わる操作を行うと、vector 内を指すすべてのイテレーター、ポインター、参照が無効になります。
落とし穴: 反復中の変更
同じ vector に対する範囲ベースの for の中で、push_back や erase を決して呼び出さないでください。新しい vector を作成するか、対象のインデックスを集めて後から処理してください。
理解度チェック
push_back によって再割り当てが発生した場合、どの反復形式でイテレーターが無効になりますか。
まとめ
インデックスが不要なら範囲ベースの for、必要ならインデックスベースの for、アルゴリズムを扱うならイテレーターベースの for を選択してください。再割り当てによってイテレーターは無効になるため、反復中に push_back を実行しないでください。
よくある質問
「vectorの反復処理:インデックス、範囲for、イテレーター」レッスンは無料ですか?
はい。「vectorの反復処理:インデックス、範囲for、イテレーター」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「vectorの反復処理:インデックス、範囲for、イテレーター」で何を学びますか?
インデックスアクセス、範囲for、明示的なイテレーターでvectorを反復処理します。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「vectorの反復処理:インデックス、範囲for、イテレーター」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- std::vectorの基本:push_back、size、capacity
- vectorの反復処理:インデックス、範囲for、イテレーター
- vectorの変更:insert、erase、clear
- vector、std::array、C配列の比較