再読STLのソースコード解析:ベクトル

ベクター

データ構造:

三つのデータメンバー:

反復子開始; //ヘッドポインティングベクトル空間は、現在使用され、即ちvector.begin()

イテレータ仕上げ; //エンドポイントのベクトル空間は、現在使用され、すなわちvector.end()

イテレータend_of_storage; //現在利用可能なエンドポイントのベクトル空間

重要な機能:

開始():リターンがスタート。

エンド():リターン・フィニッシュ。

サイズ():戻りsize_type(最後は() - 開始()); // size_type类似于VALUE_TYPE

容量():戻りend_of_storageスタート。

リサイズ():

最初のサイズは、要素はnew_size後)(より少ない消去されている場合、新しいサイズは、元のサイズよりも小さいか否かを判定する

そうでなければ、最後には欠けている要素を満たした(後)

ボイドサイズ変更(size_typeのnew_size、CONST T&X)
{ 
	IF(new_size <サイズ()) 消去((開始)+ new_size、エンド())。
	そうでなければ
		(端()、new_sizeサイズ()、X)を挿入します。
}

クリア():消去((開始)、エンド()); //デストラクタのみ、スペースが解除されていません  

一back():

最初の利用可能な場合仕上がりで構成次に、スペースが利用可能であるか否かを判定し、変速を終了します。

そうでない場合、コールは)(具体的な説明のinsert_aux以下、移動insert_aux。

ボイド一back(CONST T&X)
{ 
	(仕上げ= end_of_storage!)なら、{ 
		(X、フィニッシュ)を構築します。
	++仕上げ; 
	} 
		insert_aux(エンド()、x)は、
}

  

insert_aux()

コードP122ページ

特定のプロセス:

まず、仕上げは後退しながら電流容量(仕上がり!= End_of_storage)、容量がある場合、[位置、仕上げ)全体のシフト要素は、元の位置に新しい要素を挿入するか否かが判定されています。

何容量が存在しない場合、新たなスペースが最初の(元の2倍)を計算し、新しい次元のサイズに対応します。

スペースと空きスペースが完了した後にデストラクタソース要素をコピーし、新しい領域にコピーされ、元の開いた要素の終了後、3つのイテレータスタート、フィニッシュとend_of_storageを再調整

 

pop_back()

ちょうど前方pop_back()とデストラクタ、元の仕上げバック()要素は、スペースを解放しません

ボイドpop_back()
{ 
  --finish。
  Destoryは(仕上げ)。
}

  

消去()

最初の要素を[最初、最後)、最初のコピー[最後の仕上げ)の一部を削除して、その後の要素をカバーした後、エリアをクリアするには、それは、i)は、[仕上げです

仕上げは、カバーの端位置に移動させ、要素が新しい挿入位置を返します

イテレータ消去(第イテレータ、反復子最後)
{ 
	反復子I =コピー(最後、仕上げ、最初の); 
	(I、仕上げ)を破壊。
	仕上げ= finish-(最後の最初)。
	最初に返します。
}

  

インサート()

P125ブック

添加元素の数に比べて等しいかそれ以上、挿入することができる場合、予備空間は、まず、決定されます。

この場合には:

挿入ポイントは、次に、要素の新しい数の要素数よりも大きい場合、まず、要素の数は、挿入ポイントの後に決定されます。

その位置は非常に仕上げ(合計n個の要素に要素の最初の[仕上げ-N、仕上げ))、更新完了old_finish及び(CO Mn元素)の後の要素の、次に[位置、old_finish-N)、後〜M元素のold_finish合計は、完成移動し、スペースが空いたn個の要素。新しい要素を覆うまだ[位置、位置+ N)です。

その後、新しい要素の数よりも少ないです。

最初に生成要素が終了後およびNM、NMの合計上の位置に挿入されます。

スペースがm個の要素を空いたように、その後の位置〜old_finish m個の要素は、新しい末尾に移動されました。

インサート要素postition〜old_finish、Mの合計、N-M + M =書き換えN、挿入が完了する。

 

容量が不足している場合:

展開が正確にold_sizeの+ Nを保持フィットする必要があります場合は、二回//新しい長さや拡張をインストールすることができます。LEN = old_sizeの+ MAX(old_sizeの、N):最初のスペースを決めます

次に、新しい要素のためのスペースを割り当てます

そしてコピーし、新しい領域への挿入ポイントの前に元の要素、その後は、n個の要素の挿入、新しい領域への挿入ポイントの後、元のコピーの要素を埋めます。

そして、デストラクタ要素元領域と空き領域。

最後に、新しい空間に3つのイテレータの位置を調整

おすすめ

転載: www.cnblogs.com/lxy-xf/p/11455670.html