0Pricing
C++ Academy · レッスン

イテレーターの一般的なパターン:begin、end、advance

std::begin、std::end、std::advance、逆方向イテレーターを効果的に使います。

「イテレーターの一般的なパターン:begin、end、advance」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。

begin() と end()

標準コンテナはすべて、begin()(最初の要素)と end()(最後の要素の1つ先)を提供します。半開区間 [begin, end) は、反復処理の標準的な方法です。

std::vector<int> v = {1, 2, 3};
for (auto it = v.begin(); it != v.end(); ++it) {
    std::cout << *it << " ";
}

std::begin と std::end

<iterator> に定義された非メンバー関数で、C 配列を含むあらゆるコンテナで使用できます。

int arr[] = {1, 2, 3, 4};
for (auto it = std::begin(arr); it != std::end(arr); ++it) {
    std::cout << *it << " ";
}

cbegin と cend

c 版は const_iterator を返します。要素を変更する必要がなく、変更できないことをコンパイラーに保証させたい場合に使用します。

rbegin と rend

逆方向イテレータです。rbegin() は最後の要素を指し、rend() は最初の要素の1つ前を指します。

for (auto it = v.rbegin(); it != v.rend(); ++it) {
    std::cout << *it << " ";
}

std::next と std::prev

元のイテレータを変更せずに、そこからオフセットされたイテレータを返します。

auto it = v.begin();
auto next3 = std::next(it, 3);     // it + 3
auto prev1 = std::prev(it);         // it - 1

std::advance

イテレータを距離の分だけその場で変更します。カテゴリーに基づいて最適な実装を選択します。

auto it = v.begin();
std::advance(it, 5);          // moves it forward by 5

std::distance

2つのイテレータ間のステップ数を測定します。ランダムアクセスでは O(1)、それ以外では O(n) です。

auto d = std::distance(v.begin(), it);   // index of it

挿入イテレータ

代入を挿入に変換するアダプターです。

  • std::back_inserter — push_back
  • std::front_inserter — push_front
  • std::inserter — 指定位置への挿入
std::vector<int> dst;
std::copy(src.begin(), src.end(), std::back_inserter(dst));

ストリームイテレータ

std::istream_iterator と std::ostream_iterator を使用すると、ストリームを範囲のように扱えます。

// Read all ints from cin, print to cout
std::copy(
    std::istream_iterator<int>(std::cin),
    std::istream_iterator<int>{},
    std::ostream_iterator<int>(std::cout, " ")
);

反復中の要素の削除

erase は次の有効なイテレータを返します。それを受け取り、再利用してください。

for (auto it = v.begin(); it != v.end(); ) {
    if (*it < 0) it = v.erase(it);
    else         ++it;
}

イテレータの無効化

コンテナを変更すると、そのイテレータが無効になる場合があります。vector はサイズ変更時に無効になりますが、list は削除された要素のイテレータを除き、イテレータが維持されます。

理解度チェック

コンテナの最後の要素の次の位置を指すイテレータを返す関数はどれですか。

まとめ

前方向の反復には begin()/end()、逆方向の反復には rbegin()/rend() を使用します。std::next、std::prev、std::advance、std::distance は汎用的に使用できます。挿入イテレータを使うと、代入を挿入に変換できます。

よくある質問

「イテレーターの一般的なパターン:begin、end、advance」レッスンは無料ですか?

はい。「イテレーターの一般的なパターン:begin、end、advance」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。

「イテレーターの一般的なパターン:begin、end、advance」で何を学びますか?

std::begin、std::end、std::advance、逆方向イテレーターを効果的に使います。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C++ Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「イテレーターの一般的なパターン:begin、end、advance」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC++ Academyレッスンでコードを書いて実行できますか?

はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

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

  1. イテレーターカテゴリー:input、forward、bidirectional、random
  2. イテレーターの一般的なパターン:begin、end、advance
  3. C++20 Rangesライブラリ入門
  4. 範囲アダプター:views::filter、transform、take
← C++ Academyに戻る