イテレーターの一般的なパターン: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 - 1std::advance
イテレータを距離の分だけその場で変更します。カテゴリーに基づいて最適な実装を選択します。
auto it = v.begin();
std::advance(it, 5); // moves it forward by 5std::distance
2つのイテレータ間のステップ数を測定します。ランダムアクセスでは O(1)、それ以外では O(n) です。
auto d = std::distance(v.begin(), it); // index of it挿入イテレータ
代入を挿入に変換するアダプターです。
std::back_inserter— push_backstd::front_inserter— push_frontstd::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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- イテレーターカテゴリー:input、forward、bidirectional、random
- イテレーターの一般的なパターン:begin、end、advance
- C++20 Rangesライブラリ入門
- 範囲アダプター:views::filter、transform、take