C++双方向イテレータ
範囲の要素のシーケンスに最後からと最初の両方の方向からアクセスする特権を持つイテレータは、双方向イテレータと呼ばれます。 。イテレータは、リストマップやセットなどのデータ型で作業できます。
双方向イテレータ 転送イテレータと同じプロパティがあります 、デクリメントできるという唯一の違いがあります-
デフォルトで構築可能、 コピー構築可能、 コピー割り当て可能で破壊可能 | X a; X b(a); b =a; |
等式/不等式演算子を使用して同等性を比較できます(両方のイテレータ値が同じ基になるシーケンスを反復する場合に意味があります)。 | a ==b a!=b |
右辺値として逆参照できます(逆参照可能な状態の場合)。 | * a a-> m |
可変イテレータ(非定数イテレータ)の場合:左辺値として逆参照できます(逆参照可能な状態の場合)。 | * a =t |
インクリメントできます(参照解除可能な状態の場合)。結果は、参照解除可能または過去のイテレーターのいずれかです。等しいと比較する2つのイテレータは、両方が増加した後も等しいと比較し続けます。 | ++ a a ++ * a ++ |
デクリメントできます(逆参照可能なイテレータ値がその前にある場合)。 | --a a-- * a-- |
左辺値は交換可能です。 | swap(a、b) |
ここで、Xは双方向イテレータ 、a、bはこのイテレータ型のオブジェクトであり、tはイテレータ型(または lvalue に割り当てることができる他の型)が指す型のオブジェクトです。 タイプXのオブジェクトを逆参照することによって返されます。
C++での双方向イテレータの概念。
-
双方向イテレータは、転送イテレータのすべての機能をサポートし、プレフィックスおよびポストフィックスデクリメント演算子もサポートします。
-
このタイプのイテレータは、最後と最初のように、双方向で要素にアクセスできます。
-
ランダムアクセスイテレータも一種の双方向イテレータです。
-
双方向イテレータには転送イテレータの機能がありますが、唯一の違いは、このイテレータをデクリメントできることです。
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<<" "; }
出力
1 2 3 4 5 6 7 8 9 10 10 9 8 7 6 5 4 3 2 1
-
C++の二分探索木イテレータ
二分木用に1つのイテレータを作成するとします。 2つの方法があります。 next()メソッドは次の要素を返し、hasNext()メソッドはブール値を返します。これは次の要素が存在するかどうかを示します。したがって、ツリーが次のような場合- そして、関数呼び出しのシーケンスは、[next()、next()、hasNext()、next()、hasNext()、next()、hasNext()、next()、hasNext()]です。出力は[3,7、true、9、true、15、true、20、false]になります これを解決するには、次の手順に従います- nextとhasNextの
-
C#のイテレータ
イテレータは、コレクションに対してカスタム反復を実行します。これは、yield returnステートメントを使用して、各要素を一度に1つずつ返します。イテレータは現在の場所を記憶し、次の反復で次の要素が返されます。 以下は例です- 例 using System; using System.Collections.Generic; using System.Linq; namespace Demo { class Program { public static IEnumerable<string> displa