2、介紹stl中的allocaotr:
和vector一樣allocator是乙個模板型別,它將記憶體配置(new運算)和記憶體釋放(delete運算)兩個階段操作區分開;
為了提公升記憶體管理效率,減少申請小記憶體造成的碎片問題,採用兩級配置器,當分配的空間大小超過128b時,會使用第一級空間配置器;當分配空間大小小於128b時,將使用第二級空間配置器,第一級空間配置器直接使用malloc,realloc,free函式進行記憶體空間的分配和釋放,而第二級空間配置器採用記憶體池技術,通過空閒鍊錶管理記憶體。
3、說一說stl迭代器刪除元素:
對於序列容器vector、deque來說,使用erase(itertor)後,後面的每個元素的迭代器都會失效,但是後面的每個元素都會往前移動乙個位置,但是erase會返回下乙個有效的迭代器;
對於關聯容器map set來說,使用了erase(itertor)後,當前元素的迭代器失效,刪除當前元素的,不會影響到下乙個元素的迭代器;
對於list來說,它使用了不連續分配的記憶體,並且它的erase方法也會返回下乙個有效的itraator。
4、stl中map資料存放形式:
紅黑樹,底層結構是雜湊表。
5、stl有什麼基本組成:
容器、迭代器、仿函式、演算法、分配器、配接器
分配器給容器分配儲存空間,演算法通過迭代器獲取容器內容,仿函式可以協助演算法完成各種操作,配接器用來套接適配仿函式。
6、stl中的map與unordered_map:
map對映,map所有元素都是pair,同時擁有key和value,pair的第一元素被視為key,第二元素被視為value,所有元素都會根據元素的key自動被排序,不允許key重複,底層用紅黑樹實現;
multimap多重對映,和map的區別是允許鍵值重複,底層用紅黑樹實現,其他同map。
7、vector和list的區別,應用:
vector是乙個連續儲存的容器,動態陣列,在堆上分配空間;
底層實現是陣列,vector增加新元素時,如果未超過當時的容量,直接新增到最後,然後調整迭代器,若沒有剩餘空間,則會重新配置原有元素個數的兩倍空間,然後將原空間元素複製初始化新空間,再向新空間增加元素,最後析構並釋放原空間,之前的迭代器會失效;效能方面:訪問o(1),插入(最後插入空間夠很快,不夠申請記憶體釋放原空間,以及對之前資料進行拷貝;中間插入記憶體夠 記憶體拷貝;不夠多乙個記憶體申請和釋放)刪除(最後刪除很快,中間刪除 記憶體拷貝)適用於隨機訪問,且不經常對非尾節點進行插入刪除;
list:動態鍊錶,在堆上分配空間,每插入乙個元素都會分配空間,每刪除乙個元素都會釋放空間;底層是雙向鍊錶,隨機訪問效能很差只能快速訪問頭尾節點,插入和刪除很快,使用也經常插入刪除大量資料的場景;
區別:vector底層實現是陣列,list是雙向鍊錶;
vector支援隨機訪問,list不支援;
vector是順序記憶體,list不是;
vector在中間節點插入刪除會導致記憶體拷貝,list不會;
vector一次性分配好記憶體,不夠時進行二倍擴容,list每次插入新節點都會進行記憶體申請;
vector隨機訪問效能良好,插入刪除效能差;list插入刪除效能好,隨機訪問效能差。
8、說一下為什麼stl中迭代器的作用,有指標為何還要迭代器:
迭代器用於提供一種方法順序訪問乙個聚合物件中各個元素,而又不暴露該物件內部表示;運用迭代器是我們可以在不知道內部表示的情況下,按照一定順序訪問聚合物件中的各個元素;
迭代器不是指標,是類模板,表現得像指標,只是通過過載了一些操作符–,++等模擬了指標的一些功能;迭代器封裝了指標,是乙個可遍歷stl容器內全部或部分元素的物件,本質是封裝了原生指標,相當於一種智慧型指標,可以根據不同型別的資料結構來實現不同的++,–等操作,迭代器返回的是物件的引用;
iterator類訪問方式就是把不同集合類的訪問邏輯抽象出來,使得不用暴露集合內部結構而達到迴圈遍歷集合的效果。
9、說一說epoll原理:
首先建立乙個epoll物件,然後使用epoll_ctl對這個物件進行操作把需要監控的描述新增進去,這些描述將會以epoll_event結構體的形式組成一顆紅黑樹,接著阻塞在epoll_wait,進入大迴圈,當某個fd上有事件發生時,核心將會把其對應的結構體放入到乙個鍊錶中,返回有事件發生的鍊錶;
10、n個整數的無序陣列,找到每個元素後面比他大的第乙個數,要求時間複雜度為o(n):
vector < int> find(vector< int> num)
}while (!s.empty())
for (int j = 0; j < arr.size(); j++)
return arr;
}11、回答一下stl裡resize和reserve的區別:
resize:改變當前容器內含有元素的數量,例如:vector< int> v;v.resize(len);v的size變為len,那麼容器新增(len-size)個元素,元素的值預設為0,當v.push_back(3)之後,3放在了容器末尾,下標為len,此時容器是size為len+1;
reserve():改變容器的最大容量,他不會生成元素,只是改變這個容器允許放入多少物件,如果reserve(len)的值大於當前的容器容量,那麼會重新分配一塊能存len個物件的空間,然後把之前的物件複製進去,銷毀之前的記憶體;
12、set和map是怎麼實現的:
集合,所有的元素都會根據元素值自動被排序,且不允許重複,底層用紅黑樹實現,set所開放的各種操作介面,rb-tree也都提供了,所以幾乎所有的set操作行為,都只是轉調rb-tree的操作行為,適用於有序不重複集合;
map對映,map對映的所有元素都是pair,同時擁有value和key,pair的第一元素被視為key第二元素被視為value,所有元素都會根據元素的減值自動被排序,不允許鍵值重複,底層是紅黑樹,適用於有序鍵值對不重複對映。
牛客網 C 面試寶典 基礎知識(4)容器和演算法
感覺牛客網的整理有丟丟凌亂 請你來說一下map和set有什麼區別,分別又是怎麼實現的?map和set都是c 的關聯容器,其底層實現都是紅黑樹 rb tree map和set區別在於 2 set的迭代器是const的,不允許修改元素的值 map允許修改value,但不允許修改key。其原因是因為map...
面試寶典12
1 請你自我介紹一下自己好嗎?3 說說你最大的缺點?4 你對薪資的要求?5 你對加班的看法?回答樣本 如果工作需要我會義不容辭加班,我現在單身,沒有任何家庭負擔,可以全身心的投入工作。但同時我也會提高工作效率,減少不必要的加班。6 如果通過這次面試我們錄用了你,但工作一段時間卻發現你根本不適合這個職...
cpp面試寶典
小白在面試寶典上的遊蕩 下面開始今日說法 比較兩端 include using namespace std int main cout 0 2 1 分析 初始化a 0,x 0,滿足a 1,且x的非為1,所以符合迴圈條件,x自加為1,a自加為1,進入迴圈體a加為2,已經不符合小於等於1的條件,所以後面...