[予約] C ++ STLの概要

出典:https://www.cnblogs.com/dyllove98/p/3214898.html

コンテナとは何ですか

データストレージには、コンテナと呼ばれ、このオブジェクトタイプの他の画像に他のオブジェクトまたはポインタを保持できるオブジェクトの種類があります:まず、我々は次のようにC ++で定義された容器であるかを理解しなければなりません。これらのメソッドは、多くの場合、プログラムの設計に使用されているので、もちろん、これは理解するのは簡単です、他のオブジェクトを保持する非常に単純な、コンテナオブジェクトは、この「対象」とはまた、処理「他のオブジェクト」アプローチのシリーズを含み、コンテナはまた利点反映「コンテナクラスは、コードの特定の問題の再利用のための良い解決策である」を

さらに別の特徴は、自分自身を延長することができるコンテナ船です。問題を解決するには、私たちはしばしば、我々は、オブジェクトを保持するために作成する必要がありますどのくらいのメモリ空間を知らないことを意味し、我々はオブジェクトストレージを必要とするどのように多くのか分かりません。明らかに、配列は、この点では無力です。ここでは、コンテナの利点は、それは限り、あなたはコンテナオブジェクトを作成すると、あなたはそれを保存したいどのように多くのオブジェクトを事前にあなたを伝える必要はありませんし、それが合理的なメソッド呼び出しを提供し、コンテナ自体によってすべての詳細を処理完了です。それはあなたのメモリに適用したり、メモリを解放し、あなたのコマンドを実行するのに最適なアルゴリズムを使用することができます。

コンテナの誕生でも、それが早期にオブジェクト指向言語の基礎であると考えられ、オブジェクト指向言語と提案したコンテナクラスは、オブジェクト指向言語では特に重要です。今、ほとんどすべてのオブジェクト指向言語はまた、コンテナのセットを伴っている、C ++で、標準テンプレートライブラリ(STL)です。

そして、異なる他の言語は、C ++処理容器は、テンプレートベースのアプローチです。標準C ++ライブラリコンテナは、データ構造の多様性を提供し、これらのデータ構造は、標準的なアルゴリズムでうまく動作することができます私たちのソフトウェア開発のための良いサポートを提供し、!

コンテナの一般的な分類

コンテナアダプタに関連付けられているシーケンシャルコンテナ、およびコンテナ:3種類のために定義されたSTL汎用コンテナ。

シーケンシャル容器が 注文テーブルとの間の線形関係の要素の一種の間である、構造が直鎖状配列のクラスタであってもよいです。この位置変更操作を削除または挿入しない限り、順次容器は、各要素は、固定位置を有します。素子の特性に応じた動作をソートするときに素子自身と時間と場所とは無関係に、注文に関連する操作が、容器の位置を直接論理要素のシーケンスを保存していません。例えば、我々は三つの追加要素のための使い捨て容器を注文し、これら三つの要素の相対的な位置及び追加のコンテナの論理的な順序が一致しています。

連想コンテナ と順序は同じコンテナではありません、コンテナは、二分木構造と言うことは、より正確な、非線形連想ツリー構造です。物理的要素間の厳密な順序関係なく、容器内に容器に格納されている、すなわち要素ない論理シーケンス要素。反復子が要素「順次」要素の特性に応じて得ることができるしかし、関連する容器は、素子の特性に応じて、他のソート機能を提供します。

注目すべき特徴は、その連想コンテナは、それが保存されたキーワードと値を関連付けることができることを意味し、データを保存するためのもう一つの重要な方法、であり、そして唯一のコンテナを保持でき順序は、(キーワードを保存するだけで考えることができますまた、考えることができる唯一の)値を保存します。容器のこの特定のクラスは、以下、この点を示しています。

コンテナアダプタは 比較的抽象的な概念である、C ++の説明は次のとおりです。アダプタの動作は、他のものの動作と同様のメカニズムのことです。コンテナアダプタは、既存のコンテナの種類は、メカニズムを実装するために、抽象作品の異なるタイプを使用できるようにすることです。実際には、唯一のインターフェース変換が発生しました。ですから、コンテナ船としてそれを理解することができ、それはコンテナの本質であるが、彼は標準コンテナの特定の種類に依存しない、それがテンプレート・コンテナことが理解されます。またはコンテナのインタフェース、およびアダプターを定義するときに、あなたが決めることができます達成するためのアダプタを使用して、コンテナの特定のタイプとして、それを理解しています。

次の表は、3つの具体的なコンテナクラス定義STLコンテナに含まれる示しています:

標準コンテナ

機能

シーケンシャルコンテナ

ベクター

背後からの迅速な挿入や削除、任意の要素への直接アクセス

前面または任意の要素への迅速な挿入や削除、ダイレクトアクセスの背面から

リスト

二重リンクリスト、すぐに挿入して、どこからそれを削除

連想コンテナ

セット

すばやく見つけ、重複する値を許可していません。

マルチセット

クイック検索は、重複値を許可します

地図

すぐに見つけることがキーワードに基づいて、多くのマッピングは、重複する値を許可していません。

マルチマップ

素早く見つけるためのキーワードをもとに多くのマッピング、重複値を許可します

コンテナアダプタ

スタック

LIFO

キュー

FIFO

PRIORITY_QUEUE

最も優先度の高い要素は、常に列のうち最初のものです

シーケンシャルコンテナ

ベクトルベクトル:  

これは、線状配列構造です。これは、アレイに対応するが、その大きさは、事前に指定され、自動的に拡張されなくてもよいです。それは我々が動的配列ベクトルとして見ることができ、その特性アレイ、同様に操作することができます。
それは自動的にデータ記憶のために連続したメモリ空間内にメモリを割り当てられているベクターを作成した後、最初のスペースの大きさを予め指定することができる能力、すなわち、サイズ()関数の戻り値デフォルトベクトルによって指定されてもよいです。割り当てられたベクトルよりも、データ・ストレージ・スペースは、メモリのブロックを再割り当てされます場合は、しかし、そのような割り当ては非常に時間がかかり、スペースの割り当てを再とき、それは行動のこの種の操作を行います:

まず、ベクトルは、より大きなメモリブロックに対して適用されます。

その後、新しいメモリブロックへのデータの原本;

第二に、元のメモリブロックのオブジェクトを破壊する(オブジェクトのデストラクタを呼び出します)。

最後に、元のメモリ空間が解放されました。

ベクトル記憶されたデータの量が大きい場合、そのような操作は、パフォーマンスの低下につながる(比較的容易ベクターが理由タイプの値をコピーするように設計されています)。だから、ベクターは、そのサイズが最適である場合にのみ、事前に知られているベクトルのパフォーマンスで、パフォーマンスが良いどのような状況下ではありません。

{それが宣言されたとき、ベクトルの大きさを説明するためにどのように。付属。

出典:https://www.runoob.com/w3cnote/cpp-vector-container-analysis.html

}。

ベクターの特徴:
(1)同一の配列として指定された連続的なストレージが、動的空間を拡張することができます。すなわち、それは配列のように動作することができ、かつ動的操作であってもよいです。通常一back()pop_backに反映()。
(2)  ランダムアクセスの利便性が、それはアレイにアクセスするように、すなわち、支持体は、[]演算子とvector.at()は
、連続無駄にされていないデータ記憶領域に記憶されているので、(3)は、スペースを節約するために、しかし、それは明確に、ほとんどの場合、実際に浪費されていない記憶領域に格納され、完全なベクトルではないことを確認します。

(4)  削除操作効率内の挿入は、このような動作は、実質的に禁止されている、非常に低いですベクターのみバックエンドの操作を追加し、削除するように設計され、その理由は、内部ベクトルは、注文テーブルの原理に従って達成されます。
(5)のみ押すと、最後のベクトルで開くことができ、押し、ベクトル頭にポップすることはできません。
動的に追加されたベクトルデータを再配置、およびコピーメモリを解放するために割り当てられたデフォルトのサイズを超えた場合(6)、この操作は非常に消費性能です。ベクトルに最適なパフォーマンスを実現するので、それはあなたがベクトルを作成するときのスペースのサイズを指定するのがベストです。

-------------------------------------------------- -----------------------------------------

二重リンクリスト一覧

データの複数のノードから成る直鎖状構造、情報のブロックを構成する各ノード(即ち、データが実際に格納されている)、及びリアドライブ前駆体ポインタへのポインタです。それに格納されているので、指定されたメモリサイズを割り当てる必要はなく、任意のストレッチであり得る非連続メモリ空間、およびリンクされたポインタ要素によって順序付け。

その構造上、ランダムな検索性能のリストが非常に悪いです、それは直接見つけるために、ベクトル要素として扱っていませんが、再オーダー1、そのリスト上のターゲット要素を発見するので、それが取得する時が来ました長いです。検索時間は、ターゲット要素の位置に比例しています。

十分な速さでランダムな検索が、それはすぐに挿入することができますし、任意のノードでの操作を削除します。リンクされたリストに保存され、その位置の各ノードリストので、3つだけの要素の最大の挿入または削除する要素が格納アドレスに影響を与える点は、この影響を受けていない後のベクトルのすべての要素が動作することになります比類のないですベクトル。

機能のリスト:
(1)自由に動的動作することができる連続したメモリ空間を使用しない;
(2)急速に内部の任意の位置に挿入または削除することができるが、当然のことながら、プッシュとポップの両方で行うことができます。
(3)  ランダムの内部にアクセスすることができない、すなわち、サポートされていません[]演算子とvector.at()と、
4)verctorに対してより多くのメモリを消費します。

-------------------------------------------------- ----------------------

両端キューの両端キューは 
、要素配列を追加して削除操作容器塩基配列の両端に最適化されます。これは、より迅速なランダムアクセスを可能にしますが、それはメモリの連続ブロックに格納されているすべてのオブジェクトのベクトルではありません、代わりに連続した複数のメモリブロックを使用すると、マッピング構造のブロックの軌跡とその順序を保存します。両端キューわずかなオーバーヘッドの両端に要素を追加または削除します。これは、スペースの再配分を必要としない、要素の終わりには、ベクターよりも効果的であることが増加しています。

実際には、両端キューがベクトルの組み合わせで、長所と短所をリストし、それがコンテナその間にあります。

両端キューの特徴:
(1)容易なランダムアクセスを、すなわち[]演算子とvector.at()、ない良好な性能ベクトルをサポートするために、
(2)挿入および欠失は内部であり得るが、パフォーマンスがリスト未満である;
3) PUSH、POPの両端で行うことができます。

-------------------------------------------------- ------------------

3の比較

ベクターは、メモリの連続したブロックであり、両端キューは、連続した複数のメモリブロックであり、別々に格納されたすべてのデータ要素をリストする、任意の二つの要素が連続していないかもしれません。

好ましくは、ベクタークエリ性能、及び、データが増加すると、それはされない限り、再度アプリケーション・メモリ・セグメントの終わりに非常に良い、効率的なランダムアクセスメモリのため。

リストには、任意の要素が不連続であってもよいし、リンクされたリストであり、それは二つの要素と次の要素へのポインタを有しています。だから、パフォーマンスの要素を削除、挿入することが最良であると、クエリのパフォーマンスが非常に悪く、挿入および欠失の多くはランダムアクセスのニーズを気にしないために。

両端キューのどこかの間にあり、そして合わせたブロックとリンクされたリストの複数のアレイで配列リストの利点の両方こと。それは良いリストクエリのパフォーマンスとなっているので、良いベクター挿入、削除のパフォーマンスがあります。あなたが挿入し、両端のデータを削除するために、ランダムアクセスとケアが必要な場合は、両端キューが最良の選択です。

連想コンテナ

赤黒木 - セット、マルチセット、マップ、マルチマップのツリー構造は、非線形、特別な平衡二分木検索の具体より効率的な使用です。

コンテナ船関連したこれら4つのクラスが同じ原理を使用しているため、ので、彼らは、アルゴリズムのコアが同じであるが、彼らはそれらの違いを記述するために、アプリケーション内のいくつかの違いがあります。

また、セットと呼ばれるSETは、実際の要素の集合であるが、そこに含まれる要素の値が一意であり、特定の順序で配置され、インスタンスの集合内の各要素のセットを参照します。それはより速く挿入時のベクトルよりそう、道リンクリストによって、組織の内部にあるが、発見し、ベクターで遅かったので最後に追加。あなたは同じキーと値を挿入すると、現在の要素の値です。

{

実際には、」マップの特殊なケースを設定し、この重要な要素には、設定された形式はないが、しかし、セット自体がキー値で、キーと値のペアは、要素自体は、マッピング自体として見ることができる地図上にマッピングしました。そう、実装上の両方が非常に大きな偶然の一致でなければなりません。そして、概念的、セットは、このようにコンテナアダプタになって、マップによって達成することができますが、それをする理由はない、私は最大の大きさを考えます、それのメモリを節約する値の値を保存することは全く不要です。」

出典:https://www.cnblogs.com/lgxZJ/p/6349084.html

}

マルチセットは、複数の、その実装のコレクションで、コレクションは、同じ要素がセット内に複数回現れることができることを意味し、ユニークである、それは要素を必要としないことを除いセットは、類似しています。

1つのデータ記憶容量に関係「キー値」1 - 提供するマップ、。その「鍵」は、容器内に繰り返し、特定の順序で配置することができない(実際には、我々はまた、キーとして設定することができる - 値記憶された関係が、それだけでなく、マップの特別な形態であるキー値です。) 。それが保存されたリストに基づいているので、それはまた、リストの長所と短所を継承します。

容器に「ボタン」を可能にするマルチマップ、および原理実質的に同様のマップは、一意ではないかもしれません。

コンテナに関連付けられた特性は、注文コンテナに対する、明らかにされている次の特性があります。

具体的実施赤黒木構造の原理、非線形二分木構造の内部に実現されている1、。

図2に示すように、設定され、マップ要素は一意性を保証するために、拡張mulmap mulsetと、このプロパティは一意でない要素を可能にすることができます。

挿入されたとき、図3に示すように、要素は、デフォルトでは昇順で、セットを注文しています。

上記の特性に基づいて、

図1に示すように、  容器インサートの関連する要素及び高速ベクトルより削除操作をベクター配列が格納され、関連付けが保存容器に連結されているので、; リストよりも遅く、それらは同一の鎖状構造が、線形リストであってもためバイナリツリーは、容器、要素の一覧を表示する以外の変更に関連する変更要素に関連付けられ、それがソートされ、各挿入および欠失は、並べ替え要素を必要とします。

2、  より遅いベクトル要素の関連するコンテナ検索動作が、リストよりもはるかに速いですベクター配列は、連続して格納され、もちろん、それが一致することはできませんが、比較的連鎖リストは非常に速く、リスト1件の検索ずつので、検索は、コンテナの大きさと時間、それに比例している、コンテナと基本の関連する複雑さを見つけますログ(N)は20倍の最大値を見つけるために、1,000,000のレコードを10倍の最大値を見つけるために、1000件のレコードがある場合など、です。より優れを反映するために、より大きな容器、関連するリストに対する容器。

図3は、ベクトル、最も重要な機能の両端キューから異なるセットの使用で、リストは内部ソートの集合であり、これは、クエリベクトルに劣るが、リストよりもはるかに強いけれども。

図4に示すように、データ「鍵」との間の関係を保持し、本実施形態では、リレーションシップクラスキー配列を使用して置換されていないマップ機能を使用。アレイは、要素のインデックス位置にデジタル型指数であり、マップはキー文字位置の要素のインデックスに使用されます。使用中マップはまた、セットを含む他の容器は、できないことは勿論であるインデックスデータ、を介して取得することができる、すなわち、配列型を動作させる方法を提供します。(STLベクターのみ、両端キュー、マップ要素、すなわちELEように、クラスの配列を用いて操作することができる[1]モード)

-------------------------------------------------- -----------------------

コンテナアダプタ

スタックスタック、キュー、およびキュー優先PRIORITY_QUEUE:3つのアダプタからなるSTL。

アダプタ自体が直接の要素を保存することはできませんコンテナのインタフェースである、要素を保持しているメカニズムは、アダプタのように考えることができることを実現するために、別の容器の順番を呼び出すことです「全ての要素保存し、コンテナをコンテナを保存します。」

オーダーのある種のコンテナを達成するために提供STL 3つのアダプタ。デフォルトのキュースタックとコンテナベースのキューが実装され、PRIORITY_QUEUEは、ベクトルコンテナに基づいて実装しましたもちろん、アダプタを作成する際に、デフォルトの実装をオーバーライドすることができるアダプタを作成するために、第2のアダプタの特定のパラメータを指定するために特定のコンテナ、コンテナを達成するために指定されてもよいです。

アダプタの特性、アダプタがないので配列は、容器のいずれかを達成することができるから構成されてもよいです。

容器構造体のこれらの種類は、一back、pop_backとバック動作を提供されるスタック操作要求を設けることができるので、その関連する基地容器は、任意の容器の配列であってもよいように、スタックの特性は、LIFOスタックです。

キューFIFOキューは、ベース容器アダプタは、それがベクトル容器上に確立することができないので、関連付けは、pop_front操作を提供しなければならない必要があること、を特徴とします。

プライオリティキューPRIORITY_QUEUEアダプタランダムアクセス要求機能、リストは、コンテナ内に確立することができないようにします。

-------------------------------------------------- ------------------------

{

「次のように簡単に要約コンテナのオーダーの違いと関連したコンテナのいくつか: 

(1)本質的な違い関連するコンテナ(連想コンテナ)注文容器(シーケンシャル容器は)によって特徴付けられる:容器は、キー(鍵)の要素を格納し、読み出すことにより関連している、順次容器要素におけるコンテナの位置によって順次格納され、アクセス要素。
(2)「関連する」「注文」とは、上位インタフェースアクセス方法を意味STLでない下地ストレージ、現れます。なぜそれを分割?STLのユーザーなので、彼らがいる限り、もともと設計された汎用的なコンテナにそれ以外の場合は逆に、その上に上部のインターフェイス要素を介して容器にアクセスする方法を知っているように、基礎となるコンテナの実装メカニズムを知る必要はありません。
(3)基礎構造としてSTLは、貯蔵容器その主ベクトル、リンクされたリスト、バイナリーツリー、およびそれらの組合せを達成します。そしてベクター配列の基本的なメモリ構造として容器主鎖を用いて、及びそれらの組み合わせ、各種スタック、キューとして、および関連するコンテナ平衡二分探索木は、基礎となる構造として記憶されます。
"

出典ます。https://blog.csdn.net/JIEJINQUANIL/article/details/51175858}

おすすめ

転載: www.cnblogs.com/jiading/p/11108731.html