C ++学習14-コンテナーのさまざまなデータ構造の概要

コンテナは、順序/関連付け/ ...に分かれています。

C ++ STLコンポーネントの1つ:コンテナー
注文コンテナー

  • ベクトル1次元配列push_back / pop_back
  • 両端キューの両端キューpush_back / pop_back push_front / pop_front
  • リスト二重循環リンクリストコンテナーpush_back / pop_back push_front / pop_front

コンテナアダプタ:イテレータなし、独自のデータ構造
なし、他のメソッドなし、他のメソッドなし、他のデータ構造なし、それはツールクラス

  • スタック栈ポップトップサイズを空にする
  • キュー队列プッシュポップフロントバックサイズが空です
  • priority_queue大きなルートヒープ/小さなルートヒーププッシュポップトップサイズが空

関連するコンテナ
セットコレクション(キー)マップマッピングテーブル(キーと値)
順不同の連想コンテナ(ハッシュテーブルの追加と削除チェックの時間の複雑さO(1))順序付けられていない
関連付けられたコンテナー= "チェーンハッシュテーブル
unordered_set
unordered_map

順序付けられた連想コンテナ(赤と黒のツリーの追加と削除のチェック時間の複雑さO(logn))規則正しく
関連付けられたコンテナー= "赤と黒のツリーの
セット
マップ

ニアコンテナ
char配列[100]; char * p
string str;
ビットセットビットコンテナー
(配列はコンテナーストリングとも呼ばれ、コンテナーニアコンテナーとも呼ばれます)
ビットセットビットコンテナー(サイズの説明が0または1ではありません)

順次コンテナ:

容器交换函数  swap 效率怎么样?
直接对指针进行交换(地址的交换) 效率高  没有对内存的开辟构造释放
PS:array是内存不变数据变

1.vector:ベクターコンテナー

2x拡張1次元配列
push_back O(1)挿入(it、val)O(n)
pop_back O(1)消去(it)O(n)
テール削除o(1)ヘッド削除O(n)
イテレータートラバーサルO(n)
演算子[]ランダムアクセスO(1)

効率関連のメソッドは、
予約(10)、サイズ変更(10)を予約します。どちらもスペースを開きますが、予約は、
空のサイズのフロントなしでメモリのみを開きます…

vector<int> vec;
vector<vector<int>> vec;  二维数组数据结构的容器开辟
vector<list<int>> vec;
list<vector<int>> vec;

2.deque:両端キューコンテナー

deque容器为一个给定类型的元素进行线性处理,像向量一样,
它能够快速地随机访问任一个元素,并且能够高效地插入和删
除容器的尾部元素。但它又与vector不同,deque支持高效插入
和删除容器的头部元素,因此也叫做双端队列。

動的に開発された2次元配列
push_back O(1)push_front O(1)insert(it、val)O(n)
pop_back O(1)pop_front O(1)erase(it)O(n)
イテレータトラバースO(n )

容量を拡張すると、デフォルトでは1次元が2倍になります。2次元は1次元に配置
ここに画像の説明を挿入
されます。1 次元拡張のメモリは連続していないため、dequeの使用効率はvectorよりも高くなります。headとtailは2つと同じくらい速く挿入されますが、中央から挿入するとvectorより速い
空のサイズのフロントバック...

3.list:リンクリストコンテナー

ヘッドノードを持つ二重リンクリスト構造
push_back O(1)push_front O(1)insert(it、val)O(1)
pop_back O(1)pop_front O(1)erase(it)O(1)
イテレータトラバーサルO(n )

削除リストとランダムアクセスベクトルを追加する

効率関連の方法スプライス機能

list::splice实现list拼接的功能。
将源list的内容部分或全部元素删除(直接拿来 然后直接指针指向)
拼插入到目的list。
函数有以下三种声明:
void splice ( iterator position, list<T,Allocator>& x );  //
void splice ( iterator position, list<T,Allocator>& x, iterator i );
void splice ( iterator position, list<T,Allocator>& x, iterator first, iterator last );
函数说明:在list间移动元素

将x的元素移动到目的list的指定位置,高效的将他们插入到目的list并从x中删除。
目的list的大小会增加,增加的大小为插入元素的大小。x的大小相应的会减少同样的大小。
前两个函数不会涉及到元素的创建或销毁。第三个函数会。
指向被删除元素的迭代器会失效。

空サイズフロントバック…

無効化の問題:
コンテナーを追加または削除するときに更新

// 迭代器的失效问题
    for (auto it = vec.begin();
        it != vec.end();
        ++it)
    {
        if (*it > 20)
        {
            it = vec.insert(it, 100);  
//不能只写成vec.insert(it, 100)
            ++it;
        }
    }

コンテナアダプター

1.stack:スタック

最下層はdequeを使用して要素を格納し、dequeメソッドは
stack s1;
stack <int、vector> s2; と呼ばれます//ベクターがコンテナーコンテナーとして使用されることを指定しました
s1.push(10); s1.pop(); s1.top (); s1.empty(); s1.size()

デフォルトでベクターではなくdequeを使用する理由

1.初始的时候deque的二维已经有一段空间,而vector
默认没空间.所以初始内存利用率不高 用deque
2.deue的空间不连续,所以插入删除的效率高

2.queue:キュー

最下層はdequeを使用して要素を格納し、dequeのメソッドは
queue q1 と呼ばれます;
queue <int、vector> q1;
q1.push(10); q1.pop(); q1.front(); q1.back(); emptyサイズ

为什么默认用deque不用vector?
1.头尾操作方便

3.priority_queue:優先キュー

ベクトル優先度キューのデフォルトの実装は、優先度のある大きなヒープヒープ
です。出力されるたびに、最初から実装されます(ヒープの一番上の優先度が最も高い)。ヒープが大きいため、キュー内の最大の要素は最大の要素です。の

priority_queue<int> pq;
priority_queue<int, deque<int>> pq;
pq.push(10);
pq.push(45);
pq.push(31);
pq.push(21);
pq.push(89);
while(!pq.empty())
{
    int top = pq.top();..用top返回
    cout<<top<<endl;   // 89 45 31 21 10
    pq.pop();//只出不返回
}

デフォルトでベクター両端キューを使用しないのはなぜですか?
1.ヒープを構築するには、ヒープノードの検索で配列インデックスを使用して検索する必要があるため、次の表は連続メモリで計算できます。
優先度キューはビッグデータの上位k問題を解決します

優先度キューの基本となるデフォルトパラメータ:

class _Ty,//数据
class _Container = vector<_Ty>,//容器类型
class _Pr = less<typename _Container::value_type> >//函数类型
int main()
{
vector<int> vec;
for (int i = 0; i < 100000; ++i)
{
vec.push_back(rand() % 10000);
}


unordered_map<int, int> map;
for (int val : vec)
{
map[val]++;
}


// function 函数对象类型
// 小堆结构 priority_queue<pair<int, int>, vector<pair<int, int>>, greater>
using P = pair<int, int>;
using FUNC = function<bool (P&,P&)>;
using MinHeap = priority_queue<P, vector<P>, FUNC>;
MinHeap minHeap([](auto &a, auto &b)->bool
{
return a.second > b.second;
});


for_each(map.begin(),
map.end(),
[&minHeap](auto &pair)->void
{
if (minHeap.size() < 5)
{
minHeap.push(pair);
}
else
{
if (pair.second > minHeap.top().second)
{
minHeap.pop();
minHeap.push(pair);
}
}
});


while (!minHeap.empty())
{
cout << "数字:" << minHeap.top().first << " 重复次数:"
<< minHeap.top().second << endl;
minHeap.pop();
}
cout << endl;


return 0;
}

関連するコンテナ

コレクションキーマッピングテーブル[キー、値] id-> Student

1.順序容器
赤黒木

红黑树  insert/erase/query:O(log2n)  O(1) > O(log2n) > O(n) > O(n^2)
       有序的
8  12   23   35   47   59   62   69  78  89   95
                       59
            23                      78
     8            35           62           89
        12           47          69             95

2.順序付けされていないコンテナ
チェーンハッシュテーブルO(1)

通常のハッシュテーブルでは、keyの値はvalueの値とまったく同じです。つまり、データ値自体が配列の添え字として使用されます。これは、配列[2]、配列[20]、配列[35]などの直接マッピングです36個のスペース、キーによって直接アクセスされるため、追加、削除、変更はすべてO(1)ですが、スペースが多すぎます。
ここに画像の説明を挿入
ハッシュハッシュテーブル:
**ハッシュテクノロジーは、レコードとそのキーワードの格納場所にありますfと**の間の特定の対応を確立することは、各キーワードキーが格納場所f(キー)に対応することです。検索する場合、この対応する関係に従って、指定されたキーのマッピングf(キー)を見つけます。このレコードが検索セットにある場合は、f(キー)の位置にある必要があります。この対応関係を、ハッシュ関数とも呼ばれるハッシュ関数と呼びます。

マッピング関数はハッシュ関数と呼ばれ、レコードを格納する配列はハッシュテーブルと呼ばれます。
ハッシュ関数の定義:

关键字key对应一个存储位置f(key)。查找时,
根据这个对应的关系找到给定值key的映射f(key),
若查找集合中存在这个记录,则必定在f(key)的位置上。
我们把这种对应关系f成为散列函数

ハッシュテーブルの定義については、次のセクションで詳しく説明します

元の記事82件を公開 賞賛された7件 訪問4182件

おすすめ

転載: blog.csdn.net/sunshine612/article/details/105015837