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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

STL面试题

發布時間:2023/12/20 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STL面试题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://blog.csdn.NET/tianya_team/article/details/50753759


1.說說std::vector的底層(存儲)機制。

?vector就是一個動態數組,里面有一個指針指向一片連續的內存空間,當空間不夠裝下數據時,會自動申請另一片更大的空間(一般是增加當前容量的50%或100%),然后把原來的數據拷貝過去,接著釋放原來的那片空間;當釋放或者刪除里面的數據時,其存儲空間不釋放,僅僅是清空了里面的數據。


2.std::vector的自增長機制。

當已經分配的空間不夠裝下數據時,分配雙倍于當前容量的存儲區,把當前的值拷貝到新分配的內存中,并釋放原來的內存。


3.說說std::list的底層(存儲)機制。

以結點為單位存放數據,結點的地址在內存中不一定連續,每次插入或刪除一個元素,就配置或釋放一個元素空間


4.什么情況下用vector,什么情況下用list。

vector可以隨機存儲元素(即可以通過公式直接計算出元素地址,而不需要挨個查找),但在非尾部插入刪除數據時,效率很低,適合對象簡單,對象數量變化不大,隨機訪問頻繁。

list不支持隨機存儲,適用于對象大,對象數量變化頻繁,插入和刪除頻繁。


5.list自帶排序函數的排序原理。

將前兩個元素合并,再將后兩個元素合并,然后合并這兩個子序列成4個元素的子序列,重復這一過程,得到8個,16個,...,子序列,最后得到的就是排序后的序列。

時間復雜度:O(nlgn)

[cpp]?view plaincopy print?
  • void?List::sort()??
  • {??
  • ????List?carry;??
  • ????List?counter[64];??//數組元素為鏈表??
  • ????int?fill?=?0;??
  • ????while?(head->next?!=?tail)??
  • ????{??
  • ????????carry.transfer(carry.getHead()->next,?head->next,?head->next->next);?//head是哨兵,不存放有效值??
  • ?????????????????????????????????????????????????????????????????????????????//head->next元素被移走,所以while循環不需要head=head->next;??
  • ????????int?i?=?0;??
  • ????????while?(i?<?fill?&&?counter[i].getHead()->next?!=?counter[i].getHead())//counter[i]不是空??
  • ????????{??
  • ????????????counter[i].merge(carry);??
  • ????????????carry.swap(counter[i++]);??
  • ????????}??
  • ????????carry.swap(counter[i]);??
  • ????????if?(i?==?fill)?++fill;??
  • ????}??
  • ????for?(int?i?=?1;?i?<?fill;?i++)??
  • ????????counter[i].merge(counter[i?-?1]);???//通過這個實現排序(將有序的鏈表合成一個新的有序鏈表)??
  • ????swap(counter[fill?-?1]);??
  • }??

  • 6.說說std::deque的底層機制。

    deque動態地以分段連續空間組合而成,隨時可以增加一段新的連續空間并鏈接起來。不提供空間保留功能。

    注意:除非必要,我們盡可能選擇使用vector而非deque,因為deque的迭代器比vector迭代器復雜很多。對deque排序,為了提高效率,可先將deque復制到一個vector上排序,然后再復制回deque。

    deque采用一塊map(不是STL的map容器)作為主控,其為一小塊連續空間,其中每個元素都是指針,指向另一段較大的連續空間(緩沖區)。

    deque的迭代器包含4個內容:

    1)cur:迭代器當前所指元素

    2)first:此迭代器所指的緩沖區的頭。

    3)last:緩沖區尾。

    4)node:指向管控中心。


    7.說說std::map底層機制。

    map以RB-TREE為底層機制。RB-TREE是一種平衡二叉搜索樹,自動排序效果不錯。

    通過map的迭代器不能修改其鍵值,只能修改其實值。所以map的迭代器既不是const也不是mutable。


    8.vector插入刪除和list有什么區別?

    vector插入和刪除數據,需要對現有數據進行復制移動,如果vector存儲的對象很大或者構造函數很復雜,則開銷較大,如果是簡單的小數據,效率優于list。

    list插入和刪除數據,需要對現有數據進行遍歷,但在首部插入數據,效率很高。


    9.hashtable如何避免地址沖突?

    1)線性探測:先用hash function計算某個元素的插入位置,如果該位置的空間已被占用,則繼續往下尋找,知道找到一個可用空間為止。

    其刪除采用惰性刪除:只標記刪除記號,實際刪除操作等到表格重新整理時再進行。

    2)二次探測:如果計算出的位置為H且被占用,則依次嘗試H+1^2,H+2^2等(解決線性探測中主集團問題)。

    3)開鏈:每一個表格元素中維護一個list,hash function為我們分配一個list,然后在那個list執行插入、刪除等操作。


    10.hashtable,hash_set,hash_map的區別。

    hash_set以hashtable為底層,不具有排序功能,能快速查找。其鍵值就是實值。(set以RB-TREE為底層,具有排序功能。)

    hash_map以以hashtable為底層,沒有自動排序功能,能快速查找,每一個元素同時擁有一個實值和鍵值。(map以RB-TREE為底層,具有排序功能。)


    11.hash_map與map的區別?什么時候用hash_map,什么時候用map?

    構造函數:hash_map需要hash function和等于函數,而map需要比較函數(大于或小于)。

    存儲結構:hash_map以hashtable為底層,而map以RB-TREE為底層。?

    總的說來,hash_map查找速度比map快,而且查找速度基本和數據量大小無關,屬于常數級別。而map的查找速度是logn級別。但不一定常數就比log小,而且hash_map還有hash function耗時。

    如果考慮效率,特別當元素達到一定數量級時,用hash_map。

    考慮內存,或者元素數量較少時,用map。


    12.紅黑樹有什么性質?

    1)每個結點是紅色或者黑色。

    2)根結點為黑色。

    3)葉結點為黑色的NULL結點。

    4)如果結點為紅,其子節點必須為黑。

    5)任一結點到NULL的任何路徑,所含黑結點數必須相同。


    13.map和set的3個問題。

    1)為何map和set的插入刪除效率比其他序列容器高。

    因為不需要內存拷貝和內存移動

    2)為何map和set每次Insert之后,以前保存的iterator不會失效?

    因為插入操作只是結點指針換來換去,結點內存沒有改變。而iterator就像指向結點的指針,內存沒變,指向內存的指針也不會變。

    2)當數據元素增多時(從10000到20000),map的set的查找速度會怎樣變化?

    RB-TREE用二分查找法,時間復雜度為logn,所以從10000增到20000時,查找次數從log10000=14次到log20000=15次,多了1次而已。


    14.vector中begin和end函數返回的是什么?

    begin返回的是第一個元素的迭代器,end返回的是最后一個元素后面位置的迭代器。


    15.為什么vector的插入操作可能會導致迭代器失效?

    vector動態增加大小時,并不是在原空間后增加新的空間,而是以原大小的兩倍在另外配置一片較大的新空間,然后將內容拷貝過來,并釋放原來的空間。由于操作改變了空間,所以迭代器失效。


    16.vector、list、map、deque用erase(it)后,迭代器的變化。

    vector和deque是序列式容器,其內存分別是連續空間和分段連續空間,刪除迭代器it后,其后面的迭代器都失效了,此時it及其后面的迭代器會自動加1,使it指向被刪除元素的下一個元素。

    list刪除迭代器it時,其后面的迭代器都不會失效,將前面和后面連接起來即可。

    map也是只能使當前刪除的迭代器失效,其后面的迭代器依然有效。


    17.hashtable和hashmap的區別

    hashmap以hashtable為底層。主要有以下幾點不同:
    1)hashtable是Dictionary的子類,而hashmap是Map接口的一個實現類。

    2)hashtable中的方法是同步的,而hashmap的方法不同步。

    總結

    以上是生活随笔為你收集整理的STL面试题的全部內容,希望文章能夠幫你解決所遇到的問題。

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