(VI)と略記SGI-STL - 配列コンテナ(ベクトル)

stl_vector.h:
    ベクトルは:容器は、一定時間内に挿入または削除が完了した後にヘッド部又は線形中間の時間内に完了することが要求される、ランダムアクセスシーケンス要素であってもよい。
    
    _Vector_alloc_base:ベクターは基本クラステンプレートを分配する、テンプレートパラメータ型データを、それぞれT、ディスペンサータイプ_Allocator、及びブール識別_IsStatic(ディスペンサーまたはディスペンサーSGIか否かを判別するための標準)、
    データメンバー:
        _M_data_allocator:オブジェクトディスペンサー; 
        _M_start:に相当する第1バッファアドレス格納されたアプリケーション( )第1のアドレスコンテナエレメント; 
        _M_finish:アドレス長の終了時に容器の内容物を保存し; 
        _M_end_of_storage:バッファアドレスのアプリケーション終了を保存; 
    メンバ関数:
        コンストラクタ:allocator_type型ディスペンサー参照_M_data_allocatorを初期化する。
        get_allocator:オブジェクトディスペンサーを取得します_M_data_allocator; 
        _M_allocate:n型のサイズのメモリ素子のディスペンサーを介し_M_data_allocator割り当てサイズオブジェクト、
        _M_deallocate:リリースメモリ空間のサイズn型サイズの指定されたデータ要素のタイプポインタアドレスデータ要素を、
    また、提供 バージョン_Vector_alloc_base <_tp、_Allocator、trueに >;分配基底クラステンプレートはもはや使用ディスペンサーオブジェクトが、直接、静的メンバ関数が割り当てられるsimple_alloc管理を使用しての、内部
    
    ベクタベースクラスは_Vector_alloc_base、_Alloc_traits介してテンプレートパラメータ_IsStaticその基底クラスを継承:_Vector_baseは_S_instanceless初期化されて得られた抽出物; 
        コンストラクタ:オーバーロードされたバージョン、アロケータ型によるオブジェクトの初期化の一種で、さらに増加他のn個のパラメータ、事前に割り当てられた内部コール_M_allocate Nバッファ内のバイトと_M_startを調整します、_M_finish、_M_end_of_storage値は、
        デストラクタ:呼び出し_M_deallocate現在のバッファを解放する; 
    
    ベクター:ベクター鋳型配列のコンテナクラスは保護_Vector_base、デフォルトマクロ__STL_DEFAULT_ALLOCATORディスペンサーとして使用されるテンプレートパラメータディスペンサを継承し、調整することによってマクロ設定、したがってアロケータ使用できる <T> またはALLOC 
        (malloc_alloc(すなわち__malloc_alloc_template < 0 >)または__default_alloc_template <__ NODE_ALLOCATOR_THREADS、0 > デフォルト・アロケータとして); 
        反復従来型の添加及び再宣言型と定数反復子タイプ((例えば:リスト、両端キューなど)を他の容器からの異なる同じ種類のベクターイテレータ型ポインタ、他の容器)が別々にイテレータを提供する必要があります。
        get_allocator:関数ベース・クラスは、オブジェクトディスペンサーを取得し、ベース・クラスをオーバーライド;
        コンストラクタ:より多くのオーバーロードされたバージョンのコンストラクタ、分配allocator_typeパラメータを提供することを含む、初期化要素数nおよび既定値を初期化するために使用される所与の値または初期値、データ要素のアドレスをエンドツーエンドを提供する
        (uninitialized_fill_nを充填内部コールバッファブロック要素)と値__M_finishを調整する; 
        コピーコンストラクタ:同上の初期化プロセスは、
        デストラクタ:内部コール(解放しない)指定された範囲_M_start、_M_finishメモリ素子を破壊しdestroyが、
        開始:取得ヘッダーイテレータ(_M_startを返します) ; 
        エンド:イテレータ尾を得る(_M_finishを返す); 
        rbeginを引き裂く:初期化が開始と終了とイテレータオブジェクトを反転復帰するように構成された手段と、
        サイズ:取得ベクター能力、すなわちイテレータ範囲(端を()開始は、()))(実際に)メモリ空間を割り当てられている現在のコンテナです。 - 始めます( )); 
        MAX_SIZE:最大要素容量サイズ(size_type(収容可能取得 - 1)/ はsizeof (T))を、
        容量:素子容量(size_type(_M_end_of_storage受信現在入手 - 
        空:容器が空であるかどうかを決定する((開始) = = エンド())。
        オペレータは []:参照要素(*((開始)+のインデックスを返してN-)); 
        AT:演算子と関数[]、間接的に[]演算子を呼び出し、それに加えて、境界チェックは、コンテナの容量はrange_errorの上にスローされます例外は、
        _M_allocate_and_copyは:;アプリケーションnバイトのメモリ空間と空間へのデータ要素イテレータ範囲の原本のサイズは、アプリケーションが第1アドレスメモリ(イテレータ)を返し
        :予約少なくともより大きいnバイト容量現在受光素子予約を以下容量に等しいが、元のコンテナ要素とメモリ空間の破壊した後、何も、またはメモリ空間のコール_M_allocate_and_copy重量を行わない場合、メモリ空間のサイズ(および再調整
        容器と新しい_M_end_of_storageアプリケーションのためのイテレータポインタメモリ空間の容量を位置)、動作は実質的な破壊をもたらすとメモリを再適用することができるように、
        割り当てる:割り当て機能、2つのオーバーロードされたバージョン、パラメータN size_typeための1つのバージョン、CONST T&ヴァルvalがコール(コンテナ要素のn値の分布を表します_M_fill_assignフィラー分布)、パラメータ入力イテレータ範囲の別のバージョン(_M_assign_dispatchと 
        分布)。
        _M_fill_assign:nは記憶容量より大きい場合ヴァルに分注動作を充填要素は、(再適用する必要があるが、その直接為替スワップ(事実によってヴァルにn個の要素の再適用対象ベクトルによって達成されます単に交換イテレータポインタオブジェクト上のみ)
        ; nはより大きく、容量サイズより小さい場合、初期値uninitialized_fill_n直接充填コール、後端残りイテレータを充填し_M_finish尾イテレータを調整するために、nがサイズ未満である場合、最初の呼fill_nは反復子n個の要素を充填し、余剰の破壊消去する呼び出し
        メモリ空間); 
        _M_assign_dispatch:割当割当テンプレート、整数型_Is_integer _M_assign_dispatchテンプレートパラメータの要素に対応する反復子は(内部コール_M_fill_assign充填分布)のバージョン__true_type呼び出された場合、そうでない場合コール_M_assign_aux割り当て、という事実
        後者イテレータ実装がより迅速に入力イテレータ方法の代わりに、達成することができるので、関数は、入力イテレータまたはサブクラスと前方イテレータタイプのための2つのオーバーロードされたバージョンを持っているが、そうです(が、比較的遅い取得の長さを横断するために、することができ、前者の方法を使用してもちろん、後者の
        (ランダムな反復がランダムな長さが得られる取得した場合などは、効率の損失を直接減算するイテレータ等)); 
        _M_assign_aux :直接質量参加反復によって入力イテレータ型バージョン、要素を既存のコンテナ要素、要素は入力パラメータイテレータを持っている場合、コンテナ、一次容器の冗長要素の除去よりも小さいの反復容器蓋の位置、入力パラメータは、余分なイテレータを有する挿入インサートと呼ばれる 
        容器内に残っている要素。
        _M_assign_aux:前方反復子最初の呼び出しのLEN距離がイテレータの範囲を取得する前に、lenが容量よりも大きい場合型バージョン、あなたはメモリ空間を再申請する必要がありますが、その実装は唯一の交換により、実際に(ベクトルオブジェクトと直接交換のvalのn個の要素を再適用することです単に)のみイテレータポインタオブジェクトを交換 
        ; lenが容量よりも大きいサイズ未満である場合には、第1の順方向反復子にホッピングする前に、ミッドサイズは、最初のコピーとコピーを呼び出したときに、イテレータは、あらかじめ取得と呼ばれています後に残った呼初期値uninitialized_copyイテレータと後方調整_M_finish尾イテレータ元の容器にイテレータミッドレンジ・データを、
        lenはサイズ未満である場合、最後の元の容器イテレータに最初のデータをコピーするコピーが呼び出され、その後呼び出し破壊は、元の容器内の残りの冗長データ要素を破壊し_M_finishを調整し、
        フロント、バック:(最初の要素と容器の最後の要素を取得する()*(エンド()開始* - 1。異常動作が発生した場合に容器が空である場合、)); 
        一back:十分なバッファが存在する前に押された場合に容器の端部は、データ要素に押し込まれるが_M_finishでconstrucイテレータの端部に直接呼び出され tが初期化さ_M_finishを調整するように構成された、またはコールが_M_insert_auxデータ要素の終わりの前に挿入され、反復子_M_finish調整; 
        _M_insert_aux:イテレータX指定されたデータ要素を挿入する前に、バッファを調整する前に挿入した場合、十分な尾部を有しますイテレータ +容器の元の容量が0の場合:以下は、十分なメモリ空間を適用する必要がある場合、戦略を、挿入された位置に直接に元のデータ要素を上書きした後1および要素をコピーするコールcopy_backwardデータ、 
        呼;空間要素1、または元のアプリケーションスペースの2倍のメモリ空間への適用を初期化コール構築物が新しいメモリ空間の終わりにイテレータ要素を挿入し、元のコンテナの残りの部分の後に元の容器イテレータイテレータ範囲のuninitialized_copyコピーは、新しいメモリ空間に挿入ポイントイテレータデータ要素につながっ
        残りのデータ要素部分コールuninitialized_copy順次後ろにコピーされ、最後の呼び出しは破棄、_M_deallocateメモリ空間の解放とコンテナのすべての要素と新たなメモリアドレス範囲と容量を元の容器イテレータを調整することができ; 
        スワップ:交換二つのオブジェクトベクトル容器(内部事実単にイテレータポインタ)のみ交換、
        挿入:3つのオーバーロードされたバージョンを提供するステップと、
            挿入前に指定されたデータ要素xとイテレータイテレータ挿入位置を戻します
                前に、十分なバッファがある場合に挿入する前とテールイテレータ;そうでなければ、コールは、特定の挿入を達成_M_insert_aux;挿入は直接反復子_M_finishの終了時に初期値xを呼び出し、_M_finishを調整する構成
            :指定された範囲の前にイテレータイテレータに挿入されたすべての要素
                は_M_insert_dispatchを呼び出しデータ要素タイプ_Isに応じてパラメータを決定します 整数、整数か_integerリコールは、テンプレート関数としてパディングを挿入し、又は挿入_M_range_insertを呼び出し、しかし_M_range_insert _M_fill_insert場合
                、入力イテレータ、_M_range_insert特定呼がデータ要素イテレータタイプに基づいていますサイクルは、(挿入ポイントイテレータ位置の挿入中に調整するトラバーサルで)挿入データが挿入され、入力イテレータを横断呼び出されたときに、現在のポリシーは場合イテレータ採用されています 
                次のようにイテレータの範囲を取得するための最初の呼び出しの前に距離 lenは、容器は、使用可能な残りのメモリが不足することがあり、この時に発生する; 
                    1 。lenが特定のデータ要素に(残りの利用可能なメモリは、2つの例(挿入の効率を向上させるために可能なように2つの状況が存在する理由に分割されているよりも小さい場合内蔵された整数型、等));
                         1 )挿入イテレータイテレータ範囲を超える長さの末尾に挿入ポイントを: 
                            コピーコンストラクタの範囲uninitialized_copyフロントエンド内のイテレータの位置を調整する反復の終わりに位置し、容器の端部にイテレータn個のデータ要素を呼び出し; 
                            スコープ要素は、元の尾イテレータにコピーにコピーされていないイテレータを挿入する後イテレータに挿入さcopy_backwardを呼び出し、
                            挿入ポイントにコピーされた要素のコピー入力イテレータ範囲を呼び出し、
                        2 )挿入点の反復の終わりに。挿入イテレータ範囲よりも長さ:
                            イテレータ__elems_afterのスコープの挿入長の終点までイテレータを取得し、
                            後方位置__elems_after第一入力イテレータイテレータの中間位置を取得する際、事前を呼び出し、
                            呼び出し中間uninitialized_copyコピーするように構成されました反復子反復子入力レンジ容器の末尾にデータと容器イテレータテール位置イテレータの位置を調整します ;
                            イテレータの位置に新たな容器と終了イテレータ位置uninitialized_copy用容器を容器原尾イテレータ範囲データにコピーコンストラクタ挿入ポイントイテレータを呼び出す; 
                            ;要素の入力イテレータ範囲をコピーするために呼び出す挿入ポイントにコピーされている
                    2つの:十分な空きメモリ使用可能である
                        元のコンテナのサイズを取得し、容器を新しい入力イテレータを適用すると最大値の範囲に加えて、容器の元のサイズの長さをとりバッファサイズは、新しいバッファに適用されます。
                        コールuninitialized_copyコピーコンストラクタ容器データバッファの新しい範囲を挿入ポイントに第イテレータイテレータとイテレータイテレータの末尾に最初のレコードを調整し、
                        バッファの新しい端部にuninitialized_copyコピーコンストラクタ入力イテレータ範囲データを呼び出し、反復子新しいバッファを調整します尾イテレータ、
                        範囲をイテレータする容器の端部にバッファイテレータイテレータオリジナルデータの新たな末尾を指すように構成された元の容器インサートのuninitialized_copyコピーを呼び出し、
                        破壊呼び出し、_M_deallocate元の容器素子破壊やメモリ空間、容器は、それぞれの新しいイテレータを呼び出しますバッファ対応するイテレータ、
            挿入前に指定されたデータ要素イテレータN X:
                同じ_M_range_insert型バージョンのポリシー・イテレータの前に、インサートを充填_M_fill_insertを呼び出す; 
        pop_back:コンテナ要素(のポップアップ末端反復前方を終了する移動そして呼び出しは尾を破壊する破壊します エレメント); 
        ERASE 2つのオーバーロードされたバージョン、(個人的にイテレータの位置に渡されたバグがあることを感じることはpop_back前現象ではないそうでない場合は、イテレータの終わりよりもあるでしょう)指定された場所反復子要素のバージョンを削除してコピーするイテレータを終了するには、イテレータのポイントを除去した後に直接コピーするために呼び出します反復子点を除去する前に、
            移動体の前端とイテレータドを呼び出します ;イテレータ範囲同様のバージョン除去; stroy点イテレータ戻る除去要素を後続の破壊
        リサイズ2つのオーバーロードされたバージョンを提供する、コンテナのサイズをリセットするステップと、需要がコンテナサイズ元の容器のnew_sizeサイズ未満である場合、初期化パラメータとバージョン、コンテナを除去した後の最初の呼び出しearseイテレータは、データ要素にnew_sizeイテレータイテレータを起動し、イテレータの位置の末尾の範囲を調整します。
                そうでなければ呼び出しインサートは、データ要素値Xのイテレータの元の容器端部に挿入される容器new_sizeサイズ未満であり、
                無初期化パラメータバージョンと、データ要素タイプのデフォルトコンストラクタは、参照パラメータバージョンリサイズバンドを呼び出すために、
        クリア:消去するために呼び出しますコンテナデータ要素を除去するステップと、
        さらに、比較動作をサポートするために異なる比較演算子の複数のオーバーロード、
        オーバーロード代入演算子演算子 = :割り当てがサポートするために、また、できるだけ効率的な内部動作を加速するために使用される; 
    ベクターデフォルトなら以上の128バイトのmalloc、空きメモリ管理の使用を指示する場合場合、ディストリビュータとメモリプールバージョンは、一般的に比較的大きなメモリプール有意に次のベクトルメモリスペース要件は、特にいくつかを以下になるであろう操作ベクトルメンバ関数は、アプリケーション、さらにより頻繁である
    メモリ空間の破壊、したがってメモリの断片化と小型メモリ空間の頻繁なアプリケーションの主要機能を低減するスレッドプールの意義;もちろん、カスタムメモリアロケータ(メモリ・プール)を提供するために、ユーザは独立していることができれば経営戦略、ベクトル実際の連続的に割り当てられたメモリに加えて、それが可能であるため アセスイテレータまたは
    フェッチポインタまたはオペレータ[]プリフェッチ・アドレスは安全です。

 

おすすめ

転載: www.cnblogs.com/haomiao/p/11647245.html