イテレーターカテゴリー: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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- イテレーターカテゴリー:input、forward、bidirectional、random
- イテレーターの一般的なパターン:begin、end、advance
- C++20 Rangesライブラリ入門
- 範囲アダプター:views::filter、transform、take