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 plain
copy
?void
list::sort()
carry.swap(counter[i]);
if(i == fill) ++fill;
} for
(int
i = 1; 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的方法不同步。
C STL常見面試題
1.c stl 之所以得到廣泛的讚譽,也被很多人使用,不只是提供了像vector,string,list等方便的容器,更重要的是stl封裝了許多複雜的資料結構演算法和大量常用資料結構操作。vector封裝陣列,list封裝了鍊錶,map和set封裝了二叉樹等 2.標準關聯容器set,multiset...
C STL常見面試題
1.c stl 之所以得到廣泛的讚譽,也被很多人使用,不只是提供了像vector,string,list等方便的容器,更重要的是stl封裝了許多複雜的資料結構演算法和大量常用資料結構操作。vector封裝陣列,list封裝了鍊錶,map和set封裝了二叉樹等 2.標準關聯容器set,multiset...
C STL常見面試題
1.c stl 之所以得到廣泛的讚譽,也被很多人使用,不只是提供了像vector,string,list等方便的容器,更重要的是stl封裝了許多複雜的資料結構演算法和大量常用資料結構操作。vector封裝陣列,list封裝了鍊錶,map和set封裝了二叉樹等 2.標準關聯容器set,multiset...