0Pricing
C++ Academy · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. std::vectorの基本:push_back、size、capacity
  2. vectorの反復処理:インデックス、範囲for、イテレーター
  3. vectorの変更:insert、erase、clear
  4. vector、std::array、C配列の比較
← C++ Academyに戻る