[C++] STL相關面試題

(1) 爲什麼map和set的插入刪除效率比用其餘序列容器高?數據結構

由於map和set的內部數據結構是紅黑樹,它的插入和刪除不需作內存的拷貝和移動。(紅黑樹的插入和刪除是log(n)的)。性能

(2) 爲什麼每次insert以後,之前保存的iterator不會失效?spa

iterator這裏就至關於指向節點的指針,內存沒有變,指向內存的指針怎麼會失效呢(固然被刪除的那個元素自己已經失效了)。相對於vector來講,每一次刪除和插入,指針都有可能失效,調用push_back在尾部插入也是如此。由於爲了保證內部數據的連續存放,iterator指向的那塊內存在刪除和插入過程當中可能已經被其餘內存覆蓋或者內存已經被釋放了。即便時push_back的時候,容器內部空間可能不夠,須要一塊新的更大的內存,只有把之前的內存釋放,申請新的更大的內存,複製已有的數據元素到新的內存,最後把須要插入的元素放到最後,那麼之前的內存指針天然就不可用了。指針

(3) 向一個vector中添加N個元素,平均的添加的性能是?接口

看看下面代碼的輸出:內存

vector<int> v;ci

for(int i=0;i<100;i++}it

{io

  cout << v.capacity() << endl;效率

  v.push_back(i);

}

能夠看到空間的變化是0,1,2,4,8,16... (GCC下是如此,VC下不是..)

這個須要考慮到當空間不夠時,須要開闢新的內存而且發生元素的copy. 通常狀況下開闢的空間是原來的2倍。那麼平均的添加時間是:(1+2+4+...+(N-logN))/N,也就是有logN個元素添加時須要總體挪動n次,其它的操做代價是1,平均下來依舊是O(N)。

(4) 如何理解容器適配器,其與順序容器有什麼區別?

adapter原意是插座、適配器、接合器的意思。如今我須要一個棧結構,咱們能夠用deque來模擬,只在一端進行元素插入和彈出,另外一端不動。但deuqe畢竟不能直接做爲一個stack,它並不能直接地嚴格地知足你的要求,由於你不能防止別人在另外一端亂動你的東西。你須要對它進行一些包裝,做一些限制,使之只能在一端進行插入和刪除。也就是說你必須提供一個「插座」,這個「插座」一端插在deque上,另外一端插在你的程序中,你就可使用棧結構了。而stack就是這樣的「插座」,它鏈接了deque和你的程序。表面上看你使用的是stack,實際上你是經過stack這個「插座」來使用deque(由於stack徹底是用deque來實現的,它並無任何其餘的東西,它只是在deque上面做了一層包裝,至關於一個「插座」的功能)。所以,stack、queue、priority_queue這樣的類通常稱爲容器適配器,它們只是基本容器類型(vector,dequeue,list)的適配。  實際上,這也適配器模式的基本思想:將一個類的接口轉換成客戶但願的另一個接口。Adapter模式使得本來因爲接口不兼容而不能一塊兒工做的那些類能夠一塊兒工做。也就是說,在一個類的接口上提供一個「插座」類,使它變成你但願使用的接口。

相關文章
相關標籤/搜索