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

【C++】双方向イテレータ(Bidirectional Iterator)の基本と使い方を徹底解説

C++の双方向イテレータとは?

双方向イテレータ(Bidirectional Iterator)とは、範囲内の要素シーケンスに対して「末尾方向」と「先頭方向」の両側からアクセスできる特権を持つイテレータのことです。リスト(list)、マップ(map)、セット(set)といったコンテナに対して動作します。

双方向イテレータは前方イテレータ(Forward Iterator)と同じ性質をすべて備えていますが、唯一異なる点としてデクリメント(--)操作が可能であるという特徴があります。

双方向イテレータの主なプロパティ

性質有効な式
デフォルト構築、コピーコンストラクト、コピー代入、および破棄が可能X a;
X b(a);
b = a;
等価演算子・非等価演算子による等価比較が可能(両方のイテレータが同一のシーケンスを参照している場合にのみ意味を持つ)a == b
a != b
右辺値(rvalue)として間接参照が可能(参照可能な状態にある場合)*a
a->m
可変イテレータ(非constイテレータ)の場合:左辺値(lvalue)として間接参照が可能(参照可能な状態にある場合)*a = t
インクリメントが可能(参照可能な状態にある場合)。結果は参照可能なイテレータか、終端(past-the-end)イテレータになる。等しいと比較された2つのイテレータは、両方をインクリメントした後も等しいまま保たれる++a
a++
*a++
デクリメントが可能(直前に参照可能なイテレータ値が存在する場合)--a
a--
*a--
左辺値同士はスワップ可能swap(a,b)

ここで、Xは双方向イテレータ型、a および b はそのイテレータ型のオブジェクト、t はイテレータが指す型のオブジェクト(あるいは X 型オブジェクトの間接参照によって返される左辺値に代入可能な他の型のオブジェクト)を表します。

C++における双方向イテレータのポイント

  • 双方向イテレータは、前方イテレータのすべての機能に加えて、前置(prefix)および後置(postfix)デクリメント演算子をサポートしています。
  • このタイプのイテレータは、末尾方向と先頭方向の両方から要素にアクセスできます。
  • ランダムアクセスイテレータも双方向イテレータの一種です。
  • 双方向イテレータは前方イテレータの機能を備えていますが、唯一の違いはデクリメント(後退)操作も行える点です。

処理の入力と出力の関係は以下のようになります。

Input: 1 2 3 4 5 6 7 8 9 10
Output: 10 9 8 7 6 5 4 3 2 1

サンプルコード

#include <iostream>
#include<iterator>
#include<vector>
using namespace std;
int main() {
    vector<int> vec{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    vector<int> ::iterator it;
    vector<int> :: reverse_iterator rev_it;
    for(it = vec.begin(); it != vec.end(); it++)
       cout<<*it<<" ";
       cout<< endl;
    for(rev_it = vec.rbegin(); rev_it!= vec.rend(); rev_it++)
       cout<<*rev_it<<" ";
}

このサンプルコードでは、まず通常のイテレータ it を使って vector の要素を begin() から end() まで先頭から末尾へ向かって順に出力し、次にリバースイテレータ rev_it を使って rbegin() から rend() まで逆順に要素を出力しています。これにより、双方向イテレータの特性を活かして前後両方向の走査を実現しています。

実行結果

1 2 3 4 5 6 7 8 9 10
10 9 8 7 6 5 4 3 2 1
  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