vector、list、map常見問題以及實現原理

vector和list區別

  1. 從底層實現來說,vector是通過數組實現的,存儲空間上是一段連續的存儲空間;list是通過雙向鏈表實現的,把不連續的內存塊通過鏈表的方式連接在一起。
  2. 從插入刪除時間複雜度來說,vector是隨機訪問的O(1),但是插入和刪除需要移動元素O(n)。 list不支持隨機訪問,需要遍歷鏈表來查詢O(n), 但是插入和刪除效率就很高。
  3. vector空間擴大,stl中的源碼可以看看,增大的方式是首先找到一個兩倍大的內存空間,然後將原有的元素通過複製的方式初始化新的空間,然後析構釋放原空間,這樣會有個問題就是原有的迭代器都是指向原空間的,現在就失效了。

map的實現原理

map以模板(泛型)方式實現,可以存儲任意類型的數據,包括使用者自定義的數據類型。內部的實現採用了紅黑樹,紅黑樹具有自動排序的功能,因此map內部的所有元素都是有序的,紅黑樹的每一個節點都代表着map的一個元素。因此,對於map進行的查找,刪除,添加等一系列的操作都相當於是對紅黑樹進行的操作。map中的元素是按照二叉搜索樹(又名二叉查找樹、二叉排序樹,特點就是左子樹上所有節點的鍵值都小於根節點的鍵值,右子樹所有節點的鍵值都大於根節點的鍵值)存儲的,使用中序遍歷可將鍵值按照從小到大遍歷出來。

unorder_map實現原理

unordered_map內部實現了一個哈希表(也叫散列表,通過把關鍵碼值映射到Hash表中一個位置來訪問記錄,查找的時間複雜度可達到O(1),其在海量數據處理中有着廣泛應用)。因此,其元素的排列順序是無序的。
在這裏插入圖片描述

兩者的優缺點

map:
優點 有序性,紅黑樹使得很多操作在lgn的時間複雜度下就可以實現。
缺點 空間佔用率高,雖然提高了效率但是每個節點都要保存父節點 孩子節點以及紅黑的性質信息。

unorder_map:
優點:查找速度比map更快
缺點:建立hashmap比較花時間,內存會比map高一些

若考慮有序,查詢速度穩定,容器元素量少於1000,非頻繁查詢那麼考慮使用map。
若非常高頻查詢(100個元素以上,unordered_map都會比map快),內部元素可非有序,數據大超過1k甚至幾十萬上百萬時候就要考慮使用unordered_map(元素上千萬上億時4GB的內存就要擔心內存不足了,需要數據庫存儲過程挪動到磁盤中)。
hash_map相比unordered_map就是千萬級別以上內存佔用少15MB,上億時候內存佔用少300MB,百萬以下都是unordered_map佔用內存少,
且unordered_map插入刪除相比hash_map都快一倍,查找效率相比hash_map差不多,或者只快了一點約1/50到1/100。
綜合非有序或者要求穩定用map,都應該使用unordered_map,set類型也是類似的。
unordered_map 查找效率快五倍,插入更快,節省一定內存。如果沒有必要排序的話,儘量使用 hash_map(unordered_map 就是 boost 裏面的 hash_map 實現)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章