0Pricing
C++ Academy · レッスン

イテレーターカテゴリー:input、forward、bidirectional、random

イテレーターカテゴリーの違いを見分け、適合するアルゴリズムを選びます。

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

イテレータとは

イテレータは汎用化されたポインターです。アルゴリズムはイテレータを介して動作するため、基盤となるコンテナから切り離して使用できます。

5つのイテレータカテゴリー

イテレータは、その能力によって分類されます。

  • Input — 読み取り専用で、1回だけ走査可能
  • Output — 書き込み専用で、1回だけ走査可能
  • Forward — 読み書き可能で、複数回走査可能
  • Bidirectional — 前後に移動可能
  • Random Access — 整数のオフセットでジャンプ可能

入力イテレータ

1回読み取り、進めるという操作を繰り返します。前の位置に戻ることはできません。例:std::istream_iterator。

std::istream_iterator<int> in(std::cin), end;
while (in != end) {
    std::cout << *in << " ";
    ++in;
}

出力イテレータ

書き込み専用です。例:std::ostream_iterator と std::back_inserter。

std::ostream_iterator<int> out(std::cout, " ");
std::vector<int> v = {1, 2, 3};
std::copy(v.begin(), v.end(), out);

前方向イテレータ

入力イテレータと似ていますが、複数回走査できます。同じ位置から再び走査できます。例:std::forward_list。

双方向イテレータ

前方向イテレータの機能に -- が加わったものです。例:std::list、std::map、std::set。

std::list<int> l = {1, 2, 3};
auto it = l.end();
--it;        // OK, points to last element

ランダムアクセスイテレータ

双方向イテレータにジャンプ機能を加えたものです。it + n、it - n、it[k]、it1 - it2 が使用できます。例:std::vector、std::deque、生配列。

アルゴリズムの要件

各アルゴリズムは、必要とするイテレータカテゴリーの最小要件を定めています。std::sort にはランダムアクセスが必要ですが、std::find に必要なのは入力イテレータだけです。

イテレータトレイト

std::iterator_traits<Iter> は、イテレータの値型、カテゴリー、その他のプロパティをコンパイル時に提供します。

using Category = std::iterator_traits<It>::iterator_category;
using Value = std::iterator_traits<It>::value_type;

std::advance と std::distance

イテレータを汎用的に移動したり、距離を測定したりします。最も効率的な実装を選ぶために、イテレータカテゴリーを使用します。

auto it = v.begin();
std::advance(it, 5);              // efficient on random access, O(n) otherwise
auto d = std::distance(v.begin(), it);

カスタムイテレータ

独自のイテレータを作成するには、対象とするカテゴリーに必要な型エイリアスと演算を定義します。operator*、operator++、operator== などが必要です。

C++20 のイテレータコンセプト

C++20 では、std::input_iterator、std::forward_iterator、std::random_access_iterator などの正式なコンセプトが追加されました。従来のタグベースのシステムに代わるものです。

理解度チェック

it + n という式を定数時間でサポートするイテレータカテゴリーはどれですか。

まとめ

イテレータは、入力、出力、前方向、双方向、ランダムアクセスという能力によって分類されます。アルゴリズムには最低限必要なカテゴリーがあります。vector のイテレータはランダムアクセス、list と map のイテレータは双方向です。

よくある質問

「イテレーターカテゴリー:input、forward、bidirectional、random」レッスンは無料ですか?

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

「イテレーターカテゴリー:input、forward、bidirectional、random」で何を学びますか?

イテレーターカテゴリーの違いを見分け、適合するアルゴリズムを選びます。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「イテレーターカテゴリー:input、forward、bidirectional、random」レッスンにはどのくらい時間がかかりますか?

ほとんどの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に戻る