C++の双方向イテレータ(Bidirectional Iterator)とは?特徴と使い方を徹底解説
この記事では、C++における双方向イテレータ(Bidirectional Iterator)の概念について詳しく解説します。
双方向イテレータの主な特徴
- 双方向イテレータは、前方イテレータ(Forward Iterator)のすべての機能に加えて、前置および後置のデクリメント演算子(--)をサポートしています。
- この種類のイテレータは、コンテナの末尾方向にも先頭方向にも、両方向から要素へアクセスできます。
- ランダムアクセスイテレータも、双方向イテレータの一種です。
- 双方向イテレータは前方イテレータとほぼ同じ機能を持ちますが、最大の違いは逆方向(減少方向)への移動が可能であるという点です。
双方向イテレータのプロパティ
双方向イテレータには、以下のような特性があります。
| プロパティ | 式 |
|---|---|
| デフォルト構築可能、コピー代入可能、かつ破棄可能である | A p A q(p) q = p |
| 等価演算子・不等価演算子による比較が可能である | p == q p != q |
| 参照外し(デリファレンス)が可能。* 演算子で値を取得できる | *p |
| 可変(mutable)なイテレータは、左辺値として参照外しできる | *p = t |
| インクリメント演算子(++)とデクリメント演算子(--)により、前後に移動できる | p++ q-- |
サンプルコード
以下の例では、std::vectorに対して通常のイテレータで順方向に走査した場合と、リバースイテレータで逆方向に走査した場合の出力を比較しています。
#include <iostream>
#include <iterator>
#include <vector>
using namespace std;
int main() {
vector<int> vec{10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
vector<int>::iterator it;
vector<int>::reverse_iterator rev_it;
// 順方向(begin → end)で走査
for (it = vec.begin(); it != vec.end(); it++)
cout << *it << " ";
cout << endl;
// 逆方向(rbegin → rend)で走査
for (rev_it = vec.rbegin(); rev_it != vec.rend(); rev_it++)
cout << *rev_it << " ";
}出力結果
10 20 30 40 50 60 70 80 90 100 100 90 80 70 60 50 40 30 20 10
コードのポイント
vec.begin()〜vec.end()を使ったループでは、要素が先頭から末尾へ順に出力されます。vec.rbegin()〜vec.rend()を使ったリバースイテレータのループでは、要素が末尾から先頭へ逆順に出力されます。- このように、双方向イテレータの機能を利用することで、同じコンテナ内を自由に両方向へ走査できるのが大きな利点です。
-
C++で実装する二分探索木(BST)イテレータの作り方
二分探索木(BST)に対するイテレータを実装することを考えてみましょう。このイテレータには、次の2つのメソッドが必要です。 next():次の要素(次に小さい値)を返すメソッド hasNext():次の要素が存在するかどうかをブール値で返すメソッド 例えば、以下のような二分探索木があるとします。 この木に対して、関数呼び出しのシーケンスが [next(), next(), hasNext(), next(), hasNext(), next(), hasNext(), next(), hasNext()] である場合、出力は [3, 7, true, 9, true, 15, true,
-
C#のイテレータとは?yield returnによる反復処理の基本を解説
イテレータとは イテレータ(Iterator)は、コレクションに対して独自の反復処理(イテレーション)を実行するための仕組みです。C#では、yield returnステートメントを使用することで、コレクションの各要素を1つずつ順番に返すことができます。 イテレータは現在の実行位置を記憶しています。そのため、次に反復処理が要求されたときには、前回の続きから次の要素が返されます。この特性により、大量のデータを扱う場合でもメモリ効率の良い処理が可能になります。 サンプルコード 以下は、C#でイテレータを使用する例です。 using System; using System.Collections.G