vectorオブジェクトの定義と初期化、vector反復器iterator

4254 ワード

vectorオブジェクトの定義と初期化
vectorクラスはvectorオブジェクトを定義および初期化するためにいくつかの構造関数を定義します.
vector v1;
vectorはタイプTのオブジェクトを保存します.デフォルトのコンストラクション関数v 1は空です.
vectorv2(v1);
v 2はv 1のコピーです.
vectorv3(n,i);
v 3には、n個の値iの要素が含まれます.
vectorv4(n);
v 4は、値初期化要素のn個のコピーを含む.
vectorの操作
vector標準ライブラリにはstringオブジェクトに似た多くの操作があります.次の表に、最も重要なvector操作をいくつか示します.
v.empty()
vが空の場合はtrueを返し、そうでない場合はfalseを返します.
v.size()
vの要素の数を返します.
v.push_back(t)
vの末尾にtの値を持つ要素を追加します.
v[n]
vの位置がnの要素を返します.
v1 = v2
v 1の要素をv 2の要素のコピーに置き換えます.
v1 == v2
v 1がv 2と等しい場合はtrueを返します.
!=, >=
これらのオペレータが慣れている意味を維持します.
vectorに要素を追加するには
push_back()操作は、要素値を受け入れ、vectorオブジェクトの後ろ、すなわち「挿入(push)」からvectorオブジェクトの「後ろ(back)」に新しい要素として追加します.
vector反復器
標準ライブラリでは、vectorオブジェクトの要素にアクセスするために下付きラベルを使用するほか、反復器(iterator)を使用する別の要素を検出する方法も用意されています.反復器は、プログラマがコンテナ内の要素を検査し、要素の遍歴を実現できるデータ型です.
標準ライブラリはvectorを含む各標準コンテナに対して反復器タイプを定義します.反復器タイプは、下付きスケール操作よりも一般的な方法を提供します.すべての標準ライブラリコンテナでは、対応する反復器タイプが定義されていますが、少数のコンテナでは下付きスケール操作がサポートされています.反復器はすべてのコンテナに適用されるため、現代のC++プログラムは、下付き操作をサポートするvectorタイプであっても、下付き操作ではなく反復器を使用してコンテナ要素にアクセスする傾向があります.コンテナのiteratorタイプ
各コンテナタイプにはvectorなどの独自の反復器タイプが定義されています.
vector::iterator iter;
この文はiterという変数を定義し、vectorで定義されたiteratorタイプのデータ型です.各標準ライブラリコンテナタイプには、反復器の実際のタイプと同じ意味を持つiteratorというメンバーが定義されています.
異なるコンテナクラスは、コンテナ内の要素にアクセスするための独自のiteratorタイプを定義します.すなわち、各コンテナはiteratorというタイプを定義し、このタイプは(概念的に)反復器の様々な動作をサポートする.
beginとend操作
各コンテナにはbeginとendという名前の関数のペアが定義され、反復器を返します.コンテナに要素がある場合、beginから返される反復器は最初の要素を指します.
vector::iterator iter = ivec.begin();
上記の文はiterをbeginというvector操作で返される値に初期化します.vectorが空でないと仮定し、初期化後、iterはその要素がivec[0]であることを指す.
end操作で返される反復器はvectorの「末端要素の次」を指します.通常、エンド反復器(off-the-enditerator)と呼ばれ、存在しない要素を指していることを示します.vectorが空の場合、beginが返す反復器はendが返す反復器と同じです.
end操作によって返される反復器はvectorの実際の要素を指していません.逆に、vectorのすべての要素を処理したことを示す哨兵(sentinel)の役割を果たしています.
vector反復器の自己増加と解参照演算
反復器タイプは、反復器が指す要素を取得するためのいくつかのアクションを定義し、プログラマが反復器を1つの要素から別の要素に移動できるようにします.
反復器タイプは、反復器が指すr要素にアクセスするために、解参照オペレータ(*オペレータ)を使用します.
*iter = 0;
デリファレンスオペレータは、反復器が現在指している要素を返します.iterがvectorオブジェクトivecの最初の要素を指すと仮定すると、*iterとivec[0]は同じ要素を指す.上の文の効果は、この要素の値を0に割り当てることです.
反復器は、自己加算オペレータを使用して反復器を前に移動し、コンテナ内の次の要素を指します.論理的には,反復器の自己増加動作はint型オブジェクトの自己増加動作と類似している.intオブジェクトではint型の値を「1」とし,反復オブジェクトではコンテナ内の反復器を「1つ前に移動」する.したがって、iterが第1の要素を指す場合、++iterは第2の要素を指す.
end操作で返される反復器は要素を指さないため、解参照または自己増加操作はできません.
反復器の応用
for (vector::size_type ix = 0; ix != ivec.size(); ++ix)
             ivec[ix] = 0;

より典型的な方法は、反復器を使用してループを記述することです.
 // equivalent loop using iterators to reset all the elements in ivec to 0
     for (vector::iterator iter = ivec.begin();
          iter != ivec.end(); ++iter)
         *iter = 0;  // set element to which iter refers to 0

const_iterator各コンテナタイプにはconst_という名前も定義されていますiteratorのタイプです.このタイプはコンテナ内の要素の読み取りにのみ使用できますが、値を変更することはできません.
もし私たちがconst_iteratorタイプが参照を解くと、constオブジェクトへの参照が得られます.任意の定数と同様に、オブジェクトは書き換えられません.
たとえば、textがvectorタイプの場合、プログラマはそれを遍歴し、各要素を出力したい場合は、プログラムを記述できます.
 // use const_iterator because we won't change the elements
     for (vector::const_iterator iter = text.begin();
                 iter != text.end(); ++iter)
         cout << *iter << endl; // print each element in text

const_iteratorオブジェクトとconstのiteratorオブジェクトの違いは?
const反復器を宣言する場合は、反復器を初期化する必要があります.初期化されると、その値は変更できません.
vector nums(10);  // nums is nonconst
const vector::iterator cit = nums.begin();                                                                                     *cit = 1; // ok: cit can change its underlying element
     ++cit; // error: can't change the value of cit

const_iteratorタイプが参照を解くとconst値が返されます.const_の使用は許可されていませんiterator:const_に値を割り当てるiteratorタイプが参照を解くとconst値が返されます.const_の使用は許可されていませんiterator:割り当て
for (vector::const_iterator iter = text.begin();iter != text.end(); ++ iter)
     *iter = " ";     // error: *iter is const