大家知道,c++的STL標準庫很好用,裏面的vector,list,deque,stack,slist,set,map,都很好用。但是,在實際編程過程中,如何根據自己的項目需求選擇裏面的一種容器呢?
最好的辦法就是了解其中的原理,然後做選擇。(補充,如果項目中不考慮效率,就不用考慮那麼多了~畢竟STL從頭到尾都考慮了效率問題。)
vector
vector的基本原理如下:
它採用線性空間存儲數據。如果空間不夠,則另外分配新的兩倍大小的空間,然後把舊空間釋放掉。
可以看出:
①vector不適合push_front(效率很低)
②vector不適合中間插入刪除操作。中間插入刪除操作會引起內存拷貝。
list
list的原理如下:
list採用非線性的空間存儲數據。
①list適合插入刪除頻繁的場所。不管插入還是刪除,時間基本上都是常數。
②list不適合隨機線性訪問。
deque
deque基本原理:
deque採用類似文件系統的方式存儲數據。其中有數個連續空間的緩衝區存儲數據。這些緩衝區連接起來,給上層用戶一個假象就是,存儲的數據空間是連續的。
deque是list和vector的折中方案。兼有list的優點,也有vector隨機線性訪問效率高的優點。
①deque仍舊不適合中間插入刪除操作。
②deque適合線性隨機訪問數據。
stack
stack是deque的一種變種,優缺點不變。
queue(隊列)
queue是deque的一種變種,優缺點不變。
heap
heap的實現原理如圖:
heap容器採用二叉樹存儲數據。所以heap容器適合經常排序的場所。heap容器裏的數據是自動排序的~