STL 容器 与 数据结构
一.序列式容器(各元素之間是線性關系,vector, deque,list):迭代器類型,隨機訪問迭代器(list是雙向訪問迭代器,不支持隨機訪問)。
?1.vector,向量
相當于動態數組,當程序員不知道需要的數組多大時,用其來解決問題來達到最大節約空間。
在不需要擴容的情況下,它的操作時間復雜度和數組一樣。
vector占用的內存是只增不減的,它的erase和clear函數只刪除元素,不回收空間,只在vector析構時回收空間。
也有insert函數,可在任意下標位置插入、刪除(但不在尾部插入的話會導致指向vector的iterator、pointer,reference失效)。
2.deque,雙向隊列
邏輯結構:首尾都開放的動態數組
內部結構:多個連續的內存塊,在一個映射結構中保存他們的地址和順序
insert函數,可在任意下標位置插入、刪除(但不在首尾部插入的話會導致指向vector的iterator、pointer,reference失效)。
不同于vector,當deque的內存不再被使用時,會自動釋放。
3.list,雙向鏈表
list每個節點都保存了信息塊(元素值)、前驅指針、后驅指針,因此占用空間更大。
list由于是鏈表形式,在任意位置插入和刪除效率都很高O(1),但對元素的訪問復雜度O(n)。
二.關聯式容器(元素按key值有序插入:set,multiset,map,multimap,都是由紅黑樹實現)
紅黑樹查找、插入、刪除操作的時間復雜度是O(lgn)。采用插入方式生成一棵紅黑樹的時間復雜度是O(nlgn),而遍歷紅黑樹的時間復雜度是O(n)。
迭代器類型:雙向迭代器。
三.容器適配器(具有某種特殊功能的容器變種,不提供迭代器:stack、queue、priority_queue)
他們和容器的構造不同在于他們有一個參數class container,而容器有一個參數allocator
//vector template<class T,class Allocator = std::allocator<T> > class vector; //stack template<class T,class Container = std::deque<T> > class stack;首先了解一下priority_queue的定義:
template<class T,class Container = std::vector<T>,class Compare = std::less<typename Container::value_type> > class priority_queue;priority_queue的一般性構造函數
template<InputIt> priority_queue(InputIn first,InputIn last,const Compare& compare, const Container& cont); //初始化例子 priority_queue<pair<string,int>,vector<pair<string,int>>,WordFreCompare > wordQue(wordMap.begin(),wordMap.end());priority_queue默認比較符號 < ,它只保證隊首top()是最大的元素,內部不一定有序。
四.unorder_map(hash表):內部是無序的,只與key相關(所以在使用自定義類型時,map要定義 < ,unorder_map要定義==)
還有4種散列(hash)關聯容器(hash_set,hash_multiset,hash_map,hash_multimap):如果沒有沖突,散列表的查找、存取時間復雜度是O(1),但一般沖突是不可避免的,所以時間復雜度不確定。
(hash表的桶一般是數組,計算出來的hash值一般是整數,可直接作為下標訪問。)
unorder_map定義:
template<class Key,class T,class Hash = std::hash<Key>,class KeyEqual = std::equal_to<Key>,class Allocator = std::allocator< std::pair<const Key, T> > > class unordered_map;?
轉載于:https://www.cnblogs.com/wukuaiqian/p/7768850.html
總結
以上是生活随笔為你收集整理的STL 容器 与 数据结构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 决策树随机森林GBDT
- 下一篇: codevs 1269 匈牙利游戏