iterators stl
STLのイテレータの完全な概要。
このチュートリアルでは、イテレーターの詳細、イテレーターのタイプ、利点、およびイテレーターがサポートするさまざまな機能について説明します。
Chromeでxmlファイルを開く方法
イテレータとは何ですか?一般に、イテレータは、配列やコンテナなどのデータ範囲内の特定の要素を指すオブジェクトとまったく同じです。イテレータはCのポインタのようなものです。
=> ここでC ++トレーニングシリーズ全体を探してください。
学習内容:
概要概要
STLでは、イテレータは、インクリメント演算子(++)や間接参照演算子(*)などの一連の演算子を使用して、コンテナ内の要素をトラバースまたはステップスルーするために使用できるオブジェクトです。
イテレータは、コンテナ内に格納されているデータへのアクセスと操作に加えて、アルゴリズムをコンテナに接続する上で重要な役割を果たすため、STLプログラミングでは非常に重要です。
イテレータの種類
イテレータによって実装される機能に応じて、次のように分類されます。
- 入力および出力イテレータ :これらは最も単純化されたタイプのイテレータです。これらは、シングルパスを含む順次入出力操作で最も役立ちます。
- フォワードイテレータ :これらは入力イテレータと同じですが、転送方向の範囲をトラバースするために使用できるという意味で、方向、つまり順方向があります。順方向イテレータが一定でない場合は、出力イテレータとしても使用できます。ほとんどの標準STLコンテナは、少なくともフォワードイテレータをサポートしています。
- 双方向イテレータ :これらはフォワードイテレータに似ていますが、双方向であるという違いがあります。これは、これらの双方向イテレータを使用して、順方向と逆方向の範囲をトラバースできることを意味します。
- ランダムアクセスイテレータ :ランダムアクセスイテレータは、すべてのイテレータの中で最も強力です。これらは非順次イテレータです。ランダムアクセスイテレータを使用すると、各要素を順番に通過することなく、現在の値にオフセットを適用することで、任意のランダム値にアクセスできます。それらはCのポインタのような同様の特性を示します。
注意すべき点の1つは、すべてのSTLコンテナーがすべてのイテレーターをサポートしているわけではないということです。異なるコンテナーは、それらの機能の要件に応じて異なるイテレーターをサポートします。
以下は、さまざまなイテレーターを使用するコンテナーのリストです。
コンテナ | イテレータ |
---|---|
地図 | 双方向 |
スタック | イテレータなし |
キュー | イテレータなし |
優先キュー | イテレータなし |
リスト | 双方向 |
ベクター | ランダムアクセス |
そして | ランダムアクセス |
マルチマップ | 双方向 |
セットする | 双方向 |
マルチセット | 双方向 |
イテレータの利点
イテレータは、特にさまざまな範囲とコンテナを使用してプログラミングする場合に非常に役立ちます。
プログラミングでイテレータを使用する利点のいくつかを以下に要約できます。
#1)コードの再利用性
イテレータを使用してプログラム内の要素にアクセスする限り、イテレータ定義でコンテナの名前を変更し、コンテナを変更する必要があるときはいつでも同様の方法で残りのコードを使用できます。
これは、リストコンテナを使用してベクターコンテナを置き換える予定のシナリオで特に役立ちます。 ()演算子を使用していたイテレータの代わりに、コンテナを変更するときに要素にアクセスするためのコードは役に立たないでしょう。
#2)プログラミングの容易さと便利さ
イテレータには、コンテナの内容を簡単かつ便利にトラバースしてアクセスするのに役立つさまざまな組み込み関数が付属しています。
例えば 、リストまたは配列の終わりをチェックし続ける必要はありません-()演算子を使用しているときに行う必要があり、要素を追加するときのようにプログラムコードを変更する必要があり、ループのためにそれらを変更する必要があります。
イテレータを使用する場合、リストの最後に到達したときにタブを維持することなく、イテレータのbegin()関数とend()関数に直接アクセスできます。また、ループのためにそれらを変更する必要もありません。
#3)動的な追加/削除
イテレータを使用している間、()演算子で行う必要があるように要素をシフトすることなく、コンテナ内の要素を簡単かつ動的に追加または削除できます。
次の例でこれを示しましょう。
#include #include using namespace std; int main() { vector vec1 = { 1, 1, 2 }; // Declaring an iterator vector::iterator i; // Inserting element for (i = vec1.begin(); i != vec1.end(); ++i) { if (i == vec1.begin()) { i = vec1.insert(i, 3); // insert 3 at the beginning of vec1 } } // contents of vec1 3 1 1 2 cout<<'Vector contents after addition'; cout< 出力:
追加後のベクターコンテンツ
3 1 1 2
削除後のベクターコンテンツ
3 1 2
上記の例に見られるように、イテレータを使用すると、要素のシフトやコンテナの再構築という複雑なプログラミングに頼ることなく、コンテナ(この場合はベクトル)に要素を簡単に追加または削除できることがわかります。
イテレータ関数
イテレータ自体は組み込みの構造であるため、イテレータオブジェクトで実行できるさまざまな操作をサポートします。これらの操作/関数により、範囲を効率的にトラバースし、コンテナー内の要素を操作することもできます。
ここで、イテレータがサポートするいくつかの主要な操作を確認します。
- ベギン: イテレータの最初の位置または開始位置を返します。
- 終わり: イテレータの最後の位置または「終了後」の位置を返します。
- 前: 引数で指定された位置の数をデクリメントした後、新しいイテレータを返します。
- 次: 引数で指定された位置の数を進めるかインクリメントした後、新しいイテレータを返します。
- インサーター: コンテナ内の任意の位置に要素を挿入します。
- 前進: イテレータの位置を引数で指定された数にインクリメントします。
次のプログラムで、この関数/操作の一部の使用法を示します。
#include #include #include using namespace std; int main() { vector v = { 1, 1,2,3,5 }; // declaring iterators to a vector vector::iterator itr1 = v.begin(); vector::iterator itr2 = v.end(); auto it = next(itr1, 2); // displaying iterator position cout << 'Using next() the new iterator is at: '; cout << *it << ' '; cout << endl; auto it1 = prev(itr2, 2); // displaying iterator position cout << 'The position of new iterator using prev() is: '; cout << *it1 << ' '; cout << endl; //advance advance(itr1,3); // displaying iterator position cout << 'After advance operation,itr1 is positioned at: '; cout << *itr1 << ' '; cout << endl; return 0; }
出力:
next()を使用すると、新しいイテレータは次のようになります。2
prev()を使用した新しいイテレータの位置は次のとおりです。3
事前操作後、itr1は次の位置に配置されます:3
上記のプログラムを使用して、さまざまなイテレータ操作の使用法を示しました。
結論
これで、イテレータに関するこのチュートリアルは終了です。
これまで、STLの基本について説明してきました。次のチュートリアル以降、STLコンテナーとそのプログラミングから始めます。
=> ここで完全なC ++無料トレーニングシリーズを確認してください。
推奨読書