ビデオ: Section 10 2024
C ++プログラマーは、各要素のインデックスを提供することによって配列を反復処理します。しかし、この手法は、 list のようなランダムアクセスが許可されていないコンテナでは機能しません。 getFirst()やgetNext() などのメソッドに基づくソリューションを想像することができます。 しかし、標準テンプレートライブラリの設計者は、任意のタイプのコンテナを横断するための共通の方法を提供したいと考えていました。
<! --1 - >これに対して、標準テンプレートライブラリはイテレータを定義します。
イテレータ は、コンテナのメンバを指すオブジェクトです。一般的に、すべてのイテレータは次の関数をサポートしています。
-
クラスは、コレクションの最初のメンバーを指すイテレータを返すことができます。
-
イテレータは、あるメンバから次のメンバに移動できます。
-
イテレータは、リストの最後に到達すると指示を返します。
<! - 2 - > -
プログラムは、イテレータが指す要素を取得できます。
標準テンプレートライブラリには、リストを逆方向に移動するための逆イテレータも用意されています。イテレータについてのここのすべては、逆イテレータにも等しく適用されます。
リスト を反復するのに必要なコードは、 ベクトル (2つの例を挙げるに過ぎない)を走査するのに必要なコードとは異なります。ただし、イテレータはこれらの詳細を隠します。
<! - 3 - >メソッドbegin()は、リストの最初の要素を指すイテレータを返します。間接演算子*()は、イテレータが指すオブジェクトへの参照を取得します。 ++ 演算子は、イテレータをリストの次の要素に移動します。
イテレータがend() によって返される値と等しくなるまで、プログラムはリストを通って増加し続けます。 次のコードスニペットは、生徒のリストの先頭で始まり、それぞれの名前を表示します。
void displayStudents(list&students){//リストリストの最初の//要素を指すイテレータを割り当てます::iterator iter = students。ベギン(); // iteratorがリストの最後をヒットするまで、リストをループし続けます。iter!= students.end()){// iteratorがStudentを検索します。 cout << s。 sName << endl; //イテレータをリストの次の要素//に移動iter ++;}}
イテレータの宣言は非常に複雑になります。これはおそらく、'11標準で導入された 自動 宣言のための最良の正当化です:(auto iter = students。begin(); iter!= students。end(); iter ++){cout
これは、メソッドリストによって返されるすべての型の反復子であると宣言しています。:begin()、 は、前のコードスニペットに示されている苦い宣言を避けます。どのくらいクールです!