說在前面
本篇文章是騰訊技術面試題目彙總第一篇。
後續將持續推出網際網路大廠,如阿里,騰訊,百度,美團,頭條等技術面試題目,以及答案和分析。
歡迎大家點贊關注轉發。
1.map插入方式有幾種?
- 用insert函式插入pair資料,
mapStudent.insert(pair<int, string>(1, “student_one”)); - 用insert函式插入value_type資料
mapStudent.insert(map<int, string>::value_type (1, “student_one”)); - 在insert函式中使用make_pair()函式
mapStudent.insert(make_pair(1, “student_one”)); - 用陣列方式插入資料
mapStudent[1] = “student_one”;
2.STL中unordered_map(hash_map)和map的區別,hash_map如何解決衝突以及擴容
- unordered_map和map類似,都是儲存的key-value的值,可以透過key快速索引到value。不同的是unordered_map不會根據key的大小進行排序,
- 儲存時是根據key的hash值判斷元素是否相同,即unordered_map內部元素是無序的,而map中的元素是按照二叉搜尋樹儲存,進行中序遍歷會得到有序遍歷。
- 所以使用時map的key需要定義operator<。而unordered_map需要定義hash_value函式並且過載operator==。但是很多系統內建的資料型別都自帶這些,
- 那麼如果是自定義型別,那麼就需要自己過載operator<或者hash_value() 了。
- 如果需要內部元素自動排序,使用map,不需要排序使用unordered_map
- unordered_map的底層實現是hash_table;
- hash_map底層使用的是hash_table,而hash_table使用的開鏈法進行衝突避免,所有hash_map採用開鏈法進行衝突解決。
- 什麼時候擴容:當向容器新增元素的時候,會判斷當前容器的元素個數,如果大於等於閾值—即當前陣列的長度乘以載入因子的值的時候,就要自動擴容啦。
- 擴容(resize)就是重新計算容量,向HashMap物件裡不停的新增元素,而HashMap物件內部的陣列無法裝載更多的元素時,物件就需要擴大陣列的長度,以便能裝入更多的元素。
3.vector越界訪問下標,map越界訪問下標?vector刪除元素時會不會釋放空間?
- 透過下標訪問vector中的元素時不會做邊界檢查,即便下標越界。也就是說,下標與first迭代器相加的結果超過了finish迭代器的位置,程式也不會報錯,而是返回這個地址中儲存的值。如果想在訪問vector中的元素時首先進行邊界檢查,可以使用vector中的at函式。透過使用at函式不但可以透過下標訪問vector中的元素,而且在at函式內部會對下標進行邊界檢查。
- map的下標運算子[]的作用是:將key作為下標去執行查詢,並返回相應的值;如果不存在這個key,就將一個具有該key和value的某人值插入這個map。
- erase()函式,只能刪除內容,不能改變容量大小; erase成員函式,它刪除了itVect迭代器指向的元素,並且返回要被刪除的itVect之後的迭代器,迭代器相當於一個智慧指標;clear()函式,只能清空內容,不能改變容量大小;如果要想在刪除內容的同時釋放記憶體,那麼你可以選擇deque容器。
4.map[]與find的區別?
- map的下標運算子[]的作用是:將關鍵碼作為下標去執行查詢,並返回對應的值;如果不存在這個關鍵碼,就將一個具有該關鍵碼和值型別的預設值的項插入這個map。
- map的find函式:用關鍵碼執行查詢,找到了返回該位置的迭代器;如果不存在這個關鍵碼,就返回尾迭代器。
5.STL中list與queue之間的區別
- list不再能夠像vector一樣以普通指標作為迭代器,因為其節點不保證在儲存空間中連續存在;
- list插入操作和結合才做都不會造成原有的list迭代器失效;
- list不僅是一個雙向連結串列,而且還是一個環狀雙向連結串列,所以它只需要一個指標;
- list不像vector那樣有可能在空間不足時做重新配置、資料移動的操作,所以插入前的所有迭代器在插入操作之後都仍然有效;
- deque是一種雙向開口的連續線性空間,所謂雙向開口,意思是可以在頭尾兩端分別做元素的插入和刪除操作;可以在頭尾兩端分別做元素的插入和刪除操作;
- deque和vector最大的差異,一在於deque允許常數時間內對起頭端進行元素的插入或移除操作,二在於deque沒有所謂容量概念,因為它是動態地以分段連續空間組合而成,隨時可以增加一段新的空間並連結起來,deque沒有所謂的空間保留功能。
6.STL中的allocator,deallocator
- 第一級配置器直接使用malloc()、free()和relloc(),第二級配置器視情況採用不同的策略:當配置區塊超過128bytes時,視之為足夠大,便呼叫第一級配置器;當配置器區塊小於128bytes時,為了降低額外負擔,使用複雜的記憶體池整理方式,而不再用一級配置器;
- 第二級配置器主動將任何小額區塊的記憶體需求量上調至8的倍數,並維護16個free-list,各自管理大小為8~128bytes的小額區塊;
- 空間配置函式allocate(),首先判斷區塊大小,大於128就直接呼叫第一級配置器,小於128時就檢查對應的free-list。如果free-list之內有可用區塊,就直接拿來用,如果沒有可用區塊,就將區塊大小調整至8的倍數,然後呼叫refill(),為free-list重新分配空間;
- 空間釋放函式deallocate(),該函式首先判斷區塊大小,大於128bytes時,直接呼叫一級配置器,小於128bytes就找到對應的free-list然後釋放記憶體。