コンテナーのさまざまなデータ構造
コンテナは、順序/関連付け/ ...に分かれています。
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成为散列函数
ハッシュテーブルの定義については、次のセクションで詳しく説明します