C++STL基礎面試題總結


1.STL六大組件?

    容器,迭代器,算法,仿函數,空間配置器,容器配接器。

2.簡單介紹vector?
    vector 動態數組,支持隨機訪問,但是插入刪除效率低,因為內存連續分配,插入刪除將可能使迭代器失效。當分配的內存空間不足時,開辟之前的內存空間的若干倍(通常是2倍或1.5倍),將原先內存中的數據拷貝移動到新開辟的內存空間中。

3.簡單介紹list?
    list 雙向鏈表,內存不連續分配,故不支持隨機訪問,插入刪除效率高,但是查找效率低。

4.簡單介紹deque?
    deque 雙端隊列,支持隨機訪問,底層存儲機制較為復雜,由若干連續小段空間通過指針連接而成,由中央控制器map(不是容器的map)統一管理。由於特殊存儲機制,迭代器的實現較為復雜,故效率略低。

5.簡單介紹map?
    map/multiset 映射,關聯容器。每個鍵映射一個值,底層數據結構由紅黑樹實現,每次插入刪除只會影響當前節點的內存分配(開辟/釋放),所以map的插入刪除效率比用其他序列容器高。但是由於內部存儲的已經不是元素本身(例如還要存子節點地址,父親節點地址,節點顏色等),導致不能像vector一樣預分配內存空間。Set同理。

6.map與multimap的區別?
    multimap同map的區別就是multiset鍵可以重復而map鍵不能重復。

7.簡單介紹紅黑樹?
    紅黑樹雖然相比AVL樹要求兩顆子樹的高度差的絕對值小於等於1的嚴格平衡二叉樹來說沒有那么嚴格,但是仍然可以保證根節點出發的簡單路徑中最長的那條路徑長度小於等於最短的那條的兩倍。
    這是由其性質決定:
    1.節點顏色由紅色和黑色組成
    2.根節點必須為黑色
    3.葉子節點全為黑色並且是null節點
    4.紅色節點的兒子不能是紅色
    5.任意一個節點到葉子節點的所有簡單路徑中黑色節點的個數相同。
    具體每次插入和刪除通過旋轉和變色來維護這些性質,由於每次旋轉次數穩定,故性能較AVL樹好。

8.簡單介紹set/multiset?
    set/multiset 集合,關聯容器。值就是鍵,底層也由紅黑樹實現。multiset的鍵可以重復而set不能。

9.簡單介紹Unorder_map/unordered_set?
    Unordered_map由哈希桶實現,利用鏈地址法解決沖突。內部沒有按照鍵或值的任何順序進行排序,而實根據散列值組織成桶允許通過鍵直接訪問單個元素,均攤時間復雜度為常數級別。unorder_set除了值就是鍵以外和unordered_map大體相同。

10.SGI Stl的內存分配方式?
    SGI設計了兩層的配置器,也就是第一級配置器和第二級配置器,默認使用第二級配置器。第一級配置器直接調用malloc和free來分配釋放內存。第二級配置器:根據情況來判定,如果用戶需要的區塊大於128,則直接調用第一級配置器;如果用戶需要的區塊小於128,則到自由鏈表中去查找。若自由鏈表中對應位置沒有內存塊,那么就向內存池中申請內存塊。

11.為什么需要優化和內存池等細節?
    1)頻繁使用malloc、free開辟釋放小塊內存帶來的性能效率低下。
    2)內存碎片,導致不連續的內存不可用的資源浪費。

12.為什么vector的插入操作可能會導致迭代器失效?
    vector動態增加大小時,並不是在原空間后增加新的空間,而是以原大小的兩倍在另外配置一片較大的新空間,然后將內容拷貝過來,並釋放原來的空間。由於操作改變了空間,所以迭代器失效。

13.不允許有遍歷行為的容器有哪些(不提供迭代器)?
    1)queue,除了頭部外,沒有其他方法存取deque的其他元素。
    2)stack(底層以deque實現),除了最頂端外,沒有任何其他方法可以存取stack的其他元素。
    3)heap,所有元素都必須遵循特別的排序規則,不提供遍歷功能。

14.STL容器的參數allocate是用來做什么的?
    分配器用於封裝STL容器在內存管理上的低層細節。

15.vector中erase方法與algorithm中的remove方法區別?以及size()和capacity()的區別?
    vector中erase方法真正刪除了元素,迭代器不能訪問了。而remove()是STL中的一個算法,對一個容器調用remove並不會改變容器中的元素個數。remove只是簡單地將元素移到了容器的最后面,並不會真正的刪除該元素,迭代器還是可以訪問到。因為algorithm通過迭代器進行操作,不知道容器的內部結構,所以無法進行真正的刪除。
    Size()返回當前容器擁有的元素個數。而capacity返回在容器擴容之前可以存儲的元素個數。

16.為何map和set的插入刪除效率比其他序列容器高?
    因為不需要內存的移動和拷貝。

17.為何map和set每次Insert之后,以前保存的iterator不會失效?
    因為每次插入刪除會動態開辟釋放內存空間,只有當前變化的節點iterator失效,之前保存的iterator由於內存空間未發生變化所以並不會失效。

18.map能不能邊遍歷邊刪除?
    不可以,因為map刪除了一個元素之后該元素對應節點的迭代器失效,且erase並不返回下一個元素的迭代器。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM