vector:底層資料結構為陣列,支援快速隨機訪問。list:底層資料結構為雙向鍊錶,支援快速增刪。
deque:底層資料結構為乙個**控制器和多個緩衝區,詳細見stl原始碼剖析p146,支援首尾(中間不能)快速增刪,也支援隨機訪問。
stack:底層一般用23實現,封閉頭部即可,不用vector的原因應該是容量大小有限制,擴容耗時
queue:底層一般用23實現,封閉頭部即可,不用vector的原因應該是容量大小有限制,擴容耗時(stack和queue其實是介面卡,而不叫容器,因為是對容器的再封裝)
priority_queue:的底層資料結構一般為vector為底層容器,堆heap為處理規則來管理底層容器實現
set:底層資料結構為紅黑樹,有序,不重複。
multiset:底層資料結構為紅黑樹,有序,可重複。
map:底層資料結構為紅黑樹,有序,不重複。
multimap:底層資料結構為紅黑樹,有序,可重複。
hash_set:底層資料結構為hash表,無序,不重複。
hash_multiset:底層資料結構為hash表,無序,可重複 。
hash_map :底層資料結構為hash表,無序,不重複。
hash_multimap:底層資料結構為hash表,無序,可重複。
底層(儲存)機制:動態陣列,裡面有乙個指標指向一片連續的記憶體空間,當空間不夠裝下資料時會自動申請另一片更大的空間,然後把原有資料拷貝過去,接著釋放原來的那片空間(所以之前引用的vector的位址就失效了,不能訪問了);當釋放或者說是刪除裡面的資料時,其儲存空間並不會釋放,僅僅只是清空了裡面的資料。
自增長機制:
當已經分配的空間不夠裝下資料時,分配雙倍於當前容量的儲存區,把當前的值拷貝到新分配的記憶體中,並釋放原來的記憶體。對vector的任何操作,一旦引起空間重新配置,指向原vector的所有迭代器就都失效了。
在乙個vector的尾部之外的任何位置新增元素,都需要重新移動元素。而且,向乙個vector新增元素可能引起整個物件儲存空間的重新分配。重新分配乙個物件的儲存空間需要分配新的記憶體,並將元素從舊的空間移到新的空間
vector插入和刪除資料,需要對現有資料進行複製移動,如果vector儲存的物件很大或者建構函式很複雜,則開銷較大,如果是簡單的小資料,效率優於list。list插入和刪除資料,需要對現有資料進行遍歷,但在首部插入資料,效率很高。
vector可以隨機儲存元素(即可以通過公式直接計算出元素位址,而不需要挨個查詢),但在非尾部插入刪除資料時,效率很低,適合物件簡單,物件數量變化不大,隨機訪問頻繁。list不支援隨機儲存,適用於物件大,物件數量變化頻繁,插入和刪除頻繁。
map和set都是c++的關聯容器,其底層實現都是紅黑樹(rb-tree)。由於 map 和set所開放的各種操作介面,rb-tree 也都提供了,所以幾乎所有的 map 和set的操作行為,都只是轉調 rb-tree 的操作行為。map和set區別在於:
(2)set的迭代器是const的,不允許修改元素的值;map允許修改value,但不允許修改key。其原因是因為map和set是根據關鍵字排序來保證其有序性的,如果允許修改key的話,那麼首先需要刪除該鍵,然後調節平衡,再插入修改後的鍵值,調節平衡,如此一來,嚴重破壞了map和set的結構,導致iterator失效,不知道應該指向改變前的位置,還是指向改變後的位置。所以stl中將set的迭代器設定成const,不允許修改迭代器的值;而map的迭代器則不允許修改key值,允許修改value值。
set是一種關聯式容器,其特性如下:
map和set一樣是關聯式容器,它們的底層容器都是紅黑樹,區別就在於map的值不作為鍵,鍵和值是分開的。它的特性如下:
順序容器:vector,deque是隨機訪問迭代器;list是雙向迭代器容器介面卡:stack,queue,priority_queue沒有迭代器
關聯容器:set,map,multiset,multimap是雙向迭代器
unordered_set,unordered_map,unordered_multiset,unordered_multimap是前向迭代器
type_traitsiterator_traits
char traits
allocator_traits
pointer_traits
array_traits
C 常見面試問題彙總3 演算法
平衡樹是為了解決二叉查詢樹退化為鍊錶的情況,而紅黑樹是為了解決平衡樹在插入 刪除等操作需要頻繁調整的情況。1.快慢指標 public class solution 如果快指標走到盡頭,沒環 if fast null fast.next null return null 快指標重新出發,相遇位置就是入...
C 常見面試問題
一 抽象與介面的區別 1,抽象 abstract 1 抽象類中可以有抽象方法,也可沒有 2 抽象方法包含實現,也可以由子類實現 3 抽象類不能被sealed修飾,只能使用abstract關鍵字 4 抽象方法不能在抽象類外部宣告 5 抽象類只能單繼承 6 可以有虛方法 virtual 在不同的繼承中,...
C 多型常見面試問題
答 多型,通俗來說,就是多種形態,具體點就是去完成某個行為,當不同的物件去完成時會產生出不同的狀態。其中多型又分為動態多型和靜態多型。靜態多型 在程式編譯期間確定了程式的行為。動態多型 在程式執行期間,根據具體拿到的物件確定程式的具體行為,呼叫具體的函式 答 過載 指函式名相同,返回值可以不同,但形...