C++ STL 容器的一些总结
1?C++ STL類型及實現原理
1.1 順序容器
容器中的元素為有序排列,可以指定元素插入位置.
1.1.1?vector
順序存儲, 初始化過程會分配一定量空間, 在尾部插入會很快, 但是在中間插入元素, 會把之后所有元素向后平移, 所以較慢(中間刪除元素同理). 如果元素個數超過當前限制, 會重新分配更大空間, 再把原容器中所有元素都拷貝到新的容器中.
- 優點: 支持隨機訪問(用下標訪問), 性能較好
- 缺點: 除了操作尾部元素, 增刪中間元素性能較差
1.1.2 deque
同vector類似, 最大的好處是在頭尾增刪元素性能較好. 其元素存儲在一組連續的內存中, 并在一個結構中存儲這些內存追蹤, 并不是像vector一樣元素存在一塊連續的內存中.
- 優點: 支持隨機訪問(用下標訪問), 增刪首元素性能好于vector,?
- 缺點: 隨機訪問性能不如vector, 增刪性能不如list.
1.1.3 list
本質是雙向鏈表, 增刪元素速度較快, 但是并不支持用下標直接訪問元素.
- 優點: 首尾中間元素增刪性能較好.
- 缺點: 不支持隨機訪問.
1.2 關聯容器
容器中的元素插入時無法指定其位置, 如果需要修改元素值時, 不可以直接修改, 需要先找到該元素并刪掉, 再把所需的新元素插入. 其內部一般是通過紅黑樹實現的, 所以增刪及查找操作性能較好.
1.2.1 set(multiset)和map(multimap)
內部元素為順序排好的, set不允許存兩個相同的元素, 而multiset同set相比允許存在相同的元素. ,map內部元素為pair<key, value>, 其內部是按照key進行排好序的.?map不允許存兩個相同key值的元素, 而multimap同map相比允許存在相同的key值的元素.
1.2.2 哈希容器 --- unordered_set和unordered_map
STL中基于哈希表原理(https://blog.csdn.net/Michael__Wu/article/details/110480600), 其中unordered_set和unordered_map都是用的開鏈法解決通過哈希函數獲取的哈希地址相同的多個元素的存儲問題.
圖中的各個鏈表成為bucket(桶).
1.2.4 (multi)set/map與unordered_set/map對比
由于(multi)set/map的實現原理為紅黑樹, 所以其查找和增刪元素的時間復雜度均為O(log(n)), 而unordered_set/map的實現原理為哈希表, 所以其查找和增刪元素的時間復雜度均為O(1). 但是unordered_set/map所占用的內存更高, 且根據元素數量不同, 時間消耗也不一定小于(multi)set/map.
1.3 特殊容器(容器適配器)
在順序容器的基礎上實現, 屏蔽了部分功能, 增加了另一部分功能. 其中queue默認由deque實現,?priority_queue默認由vector 實現。priority_queue 是“優先隊列”。它和普通隊列的區別在于,優先隊列的隊頭元素總是最大的——即執行 pop 操作時,刪除的總是最大的元素;執行 top 操作時,返回的是最大元素的引用。
1.3.1 stack
1.3.2 queue
1.3.3?priority_queue
1.4?string
2 接口類型
2.1 公共接口
所有的容器類都有以下接口:
int size(): 返回容器對象中所含有的元素的個數.
bool empty():?返回容器對象是否為空.
2.2 順序容器
2.3 關聯容器
2.3.1 set & map
2.3.2 multiset & multimap
2.3.3 unordered_set & unordered_map
- bucket_count()? ? ? ? ? ? ?返回當前容器底層存儲鍵值(對)時,使用桶的數量。
- max_bucket_count()?? ?返回當前系統中,unordered_set(unordered_map)容器底層最多可以使用多少個桶。
- bucket_size(n)? ? ? ? ? ? ?返回第 n 個桶中存儲鍵值對的數量。
- bucket(key)? ? ? ? ? ? ? ? ? 返回以 key 為鍵的鍵值對所在桶的編號。
- load_factor()? ? ? ? ? ? ? ? 返回 unordered_map 容器中當前的負載因子。(負載因子 = 容器存儲的總鍵值對 / 桶數)
- max_load_factor()? ? ? ?返回或者設置當前 unordered_map 容器的最大負載因子。
- rehash(n)? ? ? ? ? ? ? ? ? ? ?嘗試重新調整桶的數量為等于或大于 n 的值。如果 n 大于當前容器使用的桶數,則該方法會是容器重新哈希,該容器新的桶數將等于或大于 n。反之,如果 n 的值小于當前容器使用的桶數,則調用此方法可能沒有任何作用。
- reserve(n)? ? ? ? ? ? ? ? ? ? 將容器使用的桶數(bucket_count() 方法的返回值)設置為最適合存儲 n 個元素的桶數。
- hash_function()? ? ? ? ? ?返回當前容器使用的哈希函數對象。
2.4 特殊容器(容器適配器)
2.4.1 取出一個元素
- stack: 只能通過T &?top();取到棧頂元素的引用
- queue: 只能通過S.top()返回隊頭元素的引用
- priority_queue: 同queue
2.4.2 插入一個元素
- stack: 只能通過void push (const T &?x);在棧頂放入元素
- queue: 只能通過S.push()在隊尾插入元素
- priority_queue: 同queue
2.4.3 刪除一個元素
- stack: 只能通過void pop();彈出棧頂元素
- queue: 只能通過S.pop()彈出隊首元素
- priority_queue: 同queue
3 迭代器(特殊容器: stack、queue 和 priority_queue 沒有迭代器)
3.1 迭代器種類
- 正向迭代器? ? ? ? ? ? ?容器類名::iterator? 迭代器變量;(用的最多)
- 常量正向迭代器? ? ??容器類名::const_iterator? 迭代器變量;
- 反向迭代器? ? ? ? ? ? ?容器類名::reverse_iterator? 迭代器變量;
- 常量反向迭代器? ? ??容器類名::const_reverse_iterator? 迭代器變量;
3.2 用法
假如一個正向迭代器變量為iter.
- *iter? ? 取iter指向的元素
- iter++ 指向下一個元素
總結
以上是生活随笔為你收集整理的C++ STL 容器的一些总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python显示图片列表_python读
- 下一篇: s3c2440移植MQTT