[C ++] STL関連のコンテナーの比較

目次

1.シーケンスコンテナ(ベクトル、リスト、両端キュー)

1、ベクトル(ベクトルコンテナ)

2.リスト(リンクリストコンテナ)

3. Deque(両端キューコンテナ)

 2.連想コンテナ(セット、マルチセット、マップ、マルチマップ)

1.セット(コレクション)/マルチセット(複数コレクション)

2.マップ(マッピング)/マルチマップ(複数のマッピング)

 3. unordered_set(順序なしセット)/ unordered_multiset(順序なし複数セット)unordered_map(順序なしマップ)/ unordered_multimap(順序なし複数マップ)

3、まとめ


1.シーケンスコンテナ(ベクトル、リスト、両端キュー)

1、ベクトル(ベクトルコンテナ)

C言語の動的配列と同様に、ヒープ内の連続メモリ空間格納されます

特性:

1)コンテナのメモリスペースが不足している場合、システムはさらに大きなメモリスペースを開いてメモリコピー操作を実行し、元のメモリスペースのデータを「移動」して、「古い家」を破壊します。各拡張のスペースが元の2倍であることは注目に値します。

2)配列の特性と一致して、[]演算子 、つまりランダムアクセスを使用して適切にインデックスを付けることができる連続したメモリスペースが あります。ただし、加算と削除の操作には十分な友好的ではありません。加算と削除のたびにメモリブロックのコピーが必要になるため、コードの効率に大きく影響します。
追加:push_back(val)O(1)insert(it、val)O(n)
削除:pop_back()O(1)erase(it)O(n)
クエリ:イテレーターoperator [] find O(n)binary_search O (ログ)

特別な方法:
resize(10):スペースを開きますが、データ
予約も入れます(10):スペースのみを開き、データは開きません。ベクトル空間を初期化し、ベクトル使用の効率を向上させる
 0-1 -2-4-8 -16

2.リスト(リンクリストコンテナ)

二重にリンクされたリストと同様に、ヒープ内の不連続なメモリスペースに格納され、ポインタを介したデータアクセス

機能:リンクリスト機能と一貫して、要素のメモリスペースを割り当てる必要があるたびにメモリから割り当てられ、要素を削除するとそのメモリも解放されるため、操作の追加と削除が非常に簡単です。スペース、およびコードの追加と削除の実行効率は非常に高いです。


追加:push_front(val)O(1)push_back(val)O(1)insert(it、val)O(1)
削除:pop_front()O(1)pop_back()O(1)erase(it)O( 1)
クエリ:イテレータはO(n)を見つけます

特別な方法:1またはリンクされたリストの複数のノードを外し、直接別のリンクリストに接続します。
スプライス
リスト1リスト2
list1.splice(list1.begin()、LIST2、list2.begin());
意味:リスト2の入れLIST2コンテナ.begin()のこの位置にあるノードをピックオフし、list1コンテナのlist1.begin()の開始位置に配置します。

list1.splice(list1.begin()、list2、list2.begin()、list2.end());
意味:list2.begin()からlist2コンテナのlist2.end()までのすべてのノードを取得し、 list1コンテナのlist1.begin()の開始位置 

3. Deque(両端キューコンテナ)

dequeコンテナは、特定のタイプの要素に対して線形処理を実行します。ベクトルと同様に、任意の要素にすばやくランダムにアクセスでき、コンテナのテール要素を効率的に挿入および削除できます。ただし、vectorとは異なり、dequeはコンテナのhead要素の効率的な挿入と削除をサポートしているため両端キューとも呼ばれます。

特徴:
最下層:動的に開発された2次元配列、最初の次元は2倍に拡張され、2番目の次元は固定サイズの配列であり、メモリセグメントは連続しています

dequeは、量的な連続空間のセクションで構成されます。両端キューの前または端に新しいスペースを追加する必要がある場合は、定量的な連続スペースを構成し、両端キュー全体の先頭または末尾で直列に接続します。dequeの最大のタスクは、これらのセグメント化された定量的連続空間で全体的な連続性の錯覚を維持し、ランダムアクセスインターフェイスを提供することです。「再構成、コピー、リリース」のサイクルを回避するには、複雑なイテレーター構造が必要になります。

dequeは、いわゆるマップ(STLマップコンテナではない)をマスターとして使用します。

マップは小さな連続空間であり、各要素(ここではノード、ノードと呼ばれます)は、バッファーと呼ばれる別の(より大きな)連続線形空間へのポインターです。

バッファは、両端キューの主なストレージスペースです。

増加:push_front(val)O(1)push_back(val)O(1)insert(it、val)O(n)
削除:pop_front()O(1)pop_back()O(1)erase(it)O( n)
クエリ:イテレータoperator [] find O(n)binary_search O(logn)

 2.連想コンテナ(セット、マルチセット、マップ、マルチマップ)

1.セット(コレクション)/マルチセット(複数コレクション)

セットは、特定の順序で一意の要素を格納するコンテナです。マルチセットでは要素を繰り返すことができますが、セットではできません。

特性:

セット/マルチセットの基礎となるデータ構造は、効率的なバランス検索バイナリツリーである赤黒木です。

セット:キーと値の両方が等しい(テンプレートにはパラメーターが1つだけあり、キーと値が組み合わされている)、キー値は一意である、要素のデフォルトのキー値は昇順である

マルチセット:キーと値の両方が等しい;キー値が一意ではない;要素のデフォルトのキー値が昇順である

セットコンテナの各要素は二分木の各ノードであり、セットコンテナの操作の挿入と削除の効率は比較的高いです。その理由は、二分木の要素の削除と挿入はメモリのコピーとメモリの移動を必要とせず、ポインタポイントを変更するだけだからです。

イテレータはバイナリツリーの各ノードへのポインタに相当するため、セットを挿入および削除してもイテレータが失敗することはありません。セットを挿入および削除しても、元のメモリノードの変更は変更されませんが、挿入と削除は変更されます。ベクトルの操作には通常、メモリの移動とメモリのコピーが含まれるため、イテレータは失敗します。

検索速度設定コンテナが非常に速いための二分探索法(O(LOGN))。

追加:insert({key、value})operator [] O(logn)
削除:erase(key)O(1)
クエリ:イテレーター自己検索-線形検索-O(n)find(key)メンバーメソッドO(logn)

2.マップ(マッピング)/マルチマップ(複数のマッピング)

キーと値のペアに格納された要素、つまり(key、value)に従って、特定の順序で格納されたマップ
基本的に同じ特性と使用法、およびマルチマップマップですが、唯一の違いは、キーの挿入操作を繰り返すことができることです。 insert_uniqueの代わりに基礎となるメカニズムRBツリーinsert_equal()で使用されます。 

特性:

マップ/マルチマップの基礎となるデータ構造は、効率的な平衡二分探索木である赤黒木です。

マップ:キーと値を分離します(テンプレートには2つのパラメーターがあり、前面がキー、背面が値です)。キー値は一意です。要素のデフォルトのキー値は昇順です。

マルチセット:キーと値を分離します。キー値は一意ではありません。要素のデフォルトのキー値は昇順です。

 3. unordered_set(順序なしセット)/ unordered_multiset(順序なし複数セット)
       unordered_map(順序なしマップ)/ unordered_multimap(順序なし複数マップ)

特徴:
基礎となるデータ構造:連鎖ハッシュテーブル

ハッシュテーブルは、キーコード値に従って直接アクセスされるデータ構造です。キーコード値は、対応するハッシュ関数(ハッシュ関数とも呼ばれます)を介してキーを処理することによって取得されます。キーコード値は特定の位置に対応します。 。対応する情報にアクセスする場所。これにより、キーワード情報をより高速に取得できます。

追加、削除、チェックO(1)
追加:insert({key、value})operator [] O(1)
削除:erase(key)O(1)
クエリ:イテレータ自己検索-線形検索-O(n)検索(キー)メンバーメソッドO(1)

3、まとめ

一般的なSTLコンテナの比較チャート
コンテナタイプ シーケンスコンテナ 連想コンテナ
  ベクター リスト そして セットする マルチセット 地図 マルチマップ
コンテナ名 ベクトルコンテナ リンクリストコンテナ ダブルキューコンテナ セットする 複数セット マッピング 複数のマッピング
基礎となるデータ構造 連続して格納された配列(二重拡張) 二重循環リンクリスト 配列の連続的または区分的連続ストレージ 赤黒木
ヘッダーファイルリファレンス #include <vector> #include <list> #include <deque> #include <set> #include <set> #include <map> #include <map>
要素を操作する方法 添え字演算子[]、イテレータ イテレータ 添え字演算子、イテレータ イテレータ
挿入削除操作イテレータが無効かどうか 要素の挿入と削除は無効になります

挿入:イテレータは無効になりません

削除:削除されたノードを指すイテレータが無効です

挿入:要素イテレータは無効になります

削除:head要素とtail要素、ノードを削除しないポイント、イテレーターが無効、中央の要素を削除、すべてのイテレーターが無効

挿入:イテレータは無効になりません

削除:削除されたノードを指すイテレータが無効です

 


 

おすすめ

転載: blog.csdn.net/Jacky_Feng/article/details/115016884