Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ ForwardおよびBidirectionalイテレータ | イテレータの基礎
C++ STLイテレータ

bookForwardおよびBidirectionalイテレータ

メニューを表示するにはスワイプしてください

Note
定義

前方イテレータは、マルチパストラバーサルをサポートするイテレータであり、異なるイテレータを使用して同じシーケンスを複数回走査することが可能です。前方イテレータは前方への進行のみを許可し、インクリメント(++)操作のみで移動します。これに対し、双方向イテレータもマルチパストラバーサルをサポートしますが、インクリメント(++)およびデクリメント(--)の両方の操作が可能であり、シーケンス内を前後両方向に移動できます。

前方イテレータと双方向イテレータは、C++標準テンプレートライブラリ(STL)において、異なる機能を持つコンテナの走査に不可欠です。両方のイテレータ型はマルチパストラバーサルを保証しており、コンテナが変更されない限り、複数のイテレータが互いに無効化されることなく独立して同じコンテナ上を移動できます。主な違いはサポートされる操作にあり、前方イテレータは++演算子による前方移動のみ可能ですが、双方向イテレータは++による前方移動と--による後方移動の両方が可能です。

前方イテレータを提供するコンテナには、std::forward_list(一方向リストで一方向の走査に最適化)が含まれます。双方向イテレータは、std::liststd::setstd::mapなどのコンテナで提供され、前後両方向の走査が可能です。

main.cpp

main.cpp

copy
1234567891011121314151617181920212223242526272829303132
#include <iostream> #include <forward_list> #include <list> int main() { // Traversing std::forward_list with a forward iterator std::forward_list<int> flist = {1, 2, 3, 4}; std::cout << "std::forward_list traversal (forward only): "; for (auto it = flist.begin(); it != flist.end(); ++it) std::cout << *it << " "; std::cout << std::endl; // Traversing std::list with a bidirectional iterator std::list<int> dlist = {10, 20, 30, 40}; std::cout << "std::list forward traversal: "; for (auto it = dlist.begin(); it != dlist.end(); ++it) std::cout << *it << " "; std::cout << std::endl; std::cout << "std::list backward traversal: "; auto it = dlist.end(); do { --it; std::cout << *it << " "; } while (it != dlist.begin()); std::cout << std::endl; }

上記のコードでは、2つのSTLコンテナ std::forward_liststd::list の動作を確認できます。std::forward_list は前方イテレータで走査され、++ によるインクリメントのみがサポートされています。-- を使って後方に移動することはできません。一方、std::list++ で前方に、-- で後方に走査でき、双方向イテレータによるものです。後方走査は end() から始まり、イテレータを begin() までデクリメントしていく点に注目してください。これは、前方イテレータと比較した場合の双方向イテレータの柔軟性を示しています。

main.cpp

main.cpp

copy
12345678910
#include <forward_list> int main() { std::forward_list<int> flist = {1, 2, 3}; auto it = flist.begin(); // Uncommenting the following line will cause a compilation error: // --it; return 0; }

前の例では、-- の前方イテレータに対してデクリメント演算子(std::forward_list)を使用しようとしています。これはコンパイルエラーとなります。前方イテレータは -- 演算をサポートしていないためです。インクリメントとデクリメントの両方を許可するのは、std::list のような双方向イテレータを持つコンテナのみです。

イテレータの機能
expand arrow
  • Forwardイテレータは++による前方移動のみをサポート。
  • Forwardイテレータ(例:--)にデクリメント演算子(std::forward_list)を適用するとコンパイルエラー。
  • std::listのような双方向イテレータを持つコンテナのみが++--の両方をサポート。
コンテナの特徴
expand arrow
  • std::forward_listは一方向の走査と低メモリ使用量に最適化。
  • std::listは両方向の走査をサポートするが、追加のオーバーヘッドが発生。
適切なコンテナの選択
expand arrow
  • 前方走査のみが必要な場合はstd::forward_listを使用。
  • 後方走査が必要な場合は双方向イテレータを持つコンテナを使用。
question mark

Forwardイテレータがサポートしていない操作はどれですか?

正しい答えを選んでください

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 1.  6

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セクション 1.  6
some-alt