日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STL常用容器大致对比

發布時間:2024/4/18 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STL常用容器大致对比 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.vector

? ? vector是一種動態數組,在內存中具有連續的存儲空間,支持快速隨機訪問。由于具有連續的存儲空間,所以在插入和刪除操作方面,效率比較慢。vector有多個構造函數,默認的構造函數是構造一個初始長度為0的內存空間,且分配的內存空間是以2的倍數動態增長的,在push_back的過程中,若發現分配的內存空間不足,則重新分配一段連續的內存空間,其大小是現在連續空間的2倍,再將原先空間中的元素復制到新的空間中,性能消耗比較大,尤其是當元素是非內部數據時。vector的另一個常見的問題就是clear操作。clear函數只是把vector的size清為零,但vector中的元素在內存中并沒有消除,所以在使用vector的過程中會發現內存消耗會越來越多,導致內存泄露,現在經常用的方法是swap函數來進行解決:利用swap函數,和臨時對象交換,交換以后,臨時對象消失,釋放內存。

? ? 如果你需要高效的隨即存取,而不在乎插入和刪除的效率,使用vector。

2.list

? ? list是一個雙向鏈表,因此它的內存空間是可以不連續的,通過指針來進行數據的訪問,這使list的隨機存儲變得非常低效,因此list沒有提供[]操作符的重載。但list可以很好地支持任意地方的插入和刪除,只需移動相應的指針即可。

? ? 如果你需要大量的插入和刪除,而不關心隨即存取,則應使用list。

3.deque

? ? deque和vector類似,支持快速隨機訪問。二者最大的區別在于,vector只能在末端插入數據,而deque支持雙端插入數據。deque的內存空間分布是小片的連續,小片間用鏈表相連,實際上內部有一個map的指針。deque空間的重新分配要比vector快,重新分配空間后,原有的元素是不需要拷貝的,可以認為deque是vector和list的折中。

? ? 如果你需要隨即存取,而且關心兩端數據的插入和刪除,則應使用deque。

4.map

? ? map是一種關聯容器,該容器用唯一的關鍵字來映射相應的值,即具有key-value功能。map內部自建一棵紅黑樹(一種自平衡二叉樹),這棵樹具有數據自動排序的功能,所以在map內部所有的數據都是有序的,以二叉樹的形式進行組織。map的插入和刪除效率比其他序列的容器高,因為對關聯容器來說,不需要做內存的拷貝和移動,只是指針的移動。由于map的每個數據對應紅黑樹上的一個節點,這個節點在不保存你的數據時,是占用16個字節的,一個父節點指針,左右孩子指針,還有一個枚舉值(標示紅黑色),所以map的其中的一個缺點就是比較占用內存空間。

? ? 默認情況下內部數據進行升序排列。

? ? multimap是map的單key對多value的容器。

5.hash_map

? ? hash_map使用hash表來排列配對,hash表是使用關鍵字來計算表位置。當這個表的大小合適,并且計算算法合適的情況下,hash表的算法復雜度為O(1)的,但是這是理想的情況下的,如果hash表的關鍵字計算與表位置存在沖突,那么最壞的復雜度為O(n)。

? ? 選用map還是hash_map,關鍵是看關鍵字查詢操作次數,以及你所需要保證的是查詢總體時間還是單個查詢的時間。如果是要很多次操作,要求其整體效率,那么使用hash_map,平均處理時間短。如果是少數次的操作,使用 hash_map可能造成不確定的O(N),那么使用平均處理時間相對較慢、單次處理時間恒定的map,便更好些。

? ? 默認情況下內部數據不排序。

6.set

? ? set也是一種關聯性容器,它同map一樣,底層使用紅黑樹實現,插入刪除操作時僅僅移動指針即可,不涉及內存的移動和拷貝,所以效率比較高。set中的元素都是唯一的,而且默認情況下會對元素進行升序排列。所以在set中,不能直接改變元素值,因為那樣會打亂原本正確的順序,要改變元素值必須先刪除舊元素,再插入新元素。不提供直接存取元素的任何操作函數,只能通過迭代器進行間接存取。

? ? multiset類似于數學里面的集合,集合中可以包含重復的元素。

7.queue

? ? queue是一個隊列,實現先進先出功能,queue不是標準的STL容器,卻以標準的STL容器為基礎。queue是在deque的基礎上封裝的。之所以選擇deque而不選擇vector是因為deque在刪除元素的時候釋放空間,同時在重新申請空間的時候無需拷貝所有元素。

8.stack

? ? stack是實現先進后出的功能,和queue一樣,也是內部封裝了deque。自己不直接維護被控序列的模板類,而是它存儲的容器對象來為它實現所有的功能。


總結

以上是生活随笔為你收集整理的STL常用容器大致对比的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。