C++
 Computer >> コンピューター >  >> プログラミング >> C++

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()を使ったリバースイテレータのループでは、要素が末尾から先頭へ逆順に出力されます。
  • このように、双方向イテレータの機能を利用することで、同じコンテナ内を自由に両方向へ走査できるのが大きな利点です。
  1. C++で実装する二分探索木(BST)イテレータの作り方

    二分探索木(BST)に対するイテレータを実装することを考えてみましょう。このイテレータには、次の2つのメソッドが必要です。 next():次の要素(次に小さい値)を返すメソッド hasNext():次の要素が存在するかどうかをブール値で返すメソッド 例えば、以下のような二分探索木があるとします。 この木に対して、関数呼び出しのシーケンスが [next(), next(), hasNext(), next(), hasNext(), next(), hasNext(), next(), hasNext()] である場合、出力は [3, 7, true, 9, true, 15, true,

  2. C#のイテレータとは?yield returnによる反復処理の基本を解説

    イテレータとは イテレータ(Iterator)は、コレクションに対して独自の反復処理(イテレーション)を実行するための仕組みです。C#では、yield returnステートメントを使用することで、コレクションの各要素を1つずつ順番に返すことができます。 イテレータは現在の実行位置を記憶しています。そのため、次に反復処理が要求されたときには、前回の続きから次の要素が返されます。この特性により、大量のデータを扱う場合でもメモリ効率の良い処理が可能になります。 サンプルコード 以下は、C#でイテレータを使用する例です。 using System; using System.Collections.G