C 基礎 容器和演算法

2021-09-24 05:04:02 字數 2376 閱讀 8593

1、 map和set有什麼區別,怎麼是寫的

都是關聯容器,底層實現都是紅黑樹

區別在於

2、介紹一下stl的allocator

stl的分配器用於封裝stl容器在記憶體管理上的底層細節在c++中,其記憶體配置和釋放如下

new運算分兩個階段:(1)呼叫::operator new配置記憶體;(2)呼叫物件建構函式構造物件內容

delete運算分兩個階段:(1)呼叫物件希構函式;(2)掉員工::operator delete釋放記憶體

為了精密分工,stl allocator將兩個階段操作區分開來:記憶體配置有alloc::allocate()負責,記憶體釋放由alloc::deallocate()負責;物件構造由::construct()負責,物件析構由::destroy()負責。

同時為了提公升記憶體管理的效率,減少申請小記憶體造成的記憶體碎片問題,sgi stl採用了兩級配置器,當分配的空間大小超過128b時,會使用第一級空間配置器;當分配的空間大小小於128b時,將使用第二級空間配置器。第一級空間配置器直接使用malloc()、realloc()、free()函式進行記憶體空間的分配和釋放,而第二級空間配置器採用了記憶體池技術,通過空閒鍊錶來管理記憶體。

3、 stl迭代器刪除元素

迭代器失效問題

.對於序列容器vector,deque來說,使用erase(itertor)後,後邊的每個元素的迭代器都會失效,但是後邊每個元素都會往前移動乙個位置,但是erase會返回下乙個有效的迭代器

對於關聯容器map set來說,使用了erase(iterator)後,當前元素的迭代器失效,但是其結構是紅黑樹,刪除當前元素的,不會影響到下乙個元素的迭代器,所以在呼叫erase之前,記錄下乙個元素的迭代器即可。

.對於list來說,它使用了不連續分配的記憶體,並且它的erase方法也會返回下乙個有效的iterator,因此上面兩種正確的方法都可以使用。

4、 stl中的map資料存放形式

紅黑樹。unordered——map底層結構是雜湊表

5、stl有什麼基礎組成

stl可分為容器(containers)、迭代器(iterators)、空間配置器(allocator)、配接器(adapters)、演算法(algorithms)、仿函式(functors)六個部分。

他們之間的關係:分配器給容器分配儲存空間,演算法通過迭代器獲取容器中的內容,仿函式可以協助演算法完成各種操作,配接器用來套接適配仿函式

6、vector和list的區別

vector 連續記憶體,動態陣列,堆上分配,底層是現實是陣列,增長方式是兩倍增長,訪問o(1)

動態鍊錶,堆上分配,每刪除和插入乙個元素都會分配空間,每刪除乙個元素都會釋放空間,底層是雙向鍊錶

區別1)vector底層實現是陣列;list是雙向 鍊錶。

2)vector支援隨機訪問,list不支援。

3)vector是順序記憶體,list不是。

4)vector在中間節點進行插入刪除會導致記憶體拷貝,list不會。

5)vector一次性分配好記憶體,不夠時才進行2倍擴容;list每次插入新節點都會進行記憶體申請。

6)vector隨機訪問效能好,插入刪除效能差;list隨機訪問效能差,插入刪除效能好。

應用vector擁有一段連續的記憶體空間,因此支援隨機訪問,如果需要高效的隨即訪問,而不在乎插入和刪除的效率,使用vector。

list擁有一段不連續的記憶體空間,如果需要高效的插入和刪除,而不關心隨機訪問,則應使用list。

7、 迭代器的作用,有指標為什麼要迭代器

提供一種順序訪問又不暴露該物件的內部表示的方式,iterator類的訪問方式就是把不同集合類的訪問邏輯抽象出來,使得不用暴露集合內部的結構而達到迴圈遍歷集合的效果。

與指標的區別

返回的是物件引用而不是物件的值,用解位址符取得物件

8、epoll原理

呼叫順序:

int epoll_create(int size);

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout);

首先建立乙個epoll物件,然後使用epoll_ctl對這個物件進行操作,把需要監控的描述新增進去,這些描述如將會以epoll_event結構體的形式組成一顆紅黑樹,接著阻塞在epoll_wait,進入大迴圈,當某個fd上有事件發生時,核心將會把其對應的結構體放入到乙個鍊錶中,返回有事件發生的鍊錶。

9、 resize()和reserve()的區別

resize():改變當前容器內含有元素的數量(size())

reserve():改變當前容器的最大容量(capacity),它不會生成元素,只是確定這個容器允許放入多少物件

C 容器和演算法

c 容器和演算法 容器部分 順序容器 vector deque list 通過元素在容器中的位置順序儲存和訪問元素 vector 支援快速隨機訪問 容器介面卡為stack後進先出棧 deque 雙端佇列 容器介面卡為priority queue有優先順序管理的佇列 list 支援快速插入 刪除 容器...

C 容器和演算法

1.map和set有什麼區別,分別又是怎麼實現的?2.stl的allocator?c 容器的空間配置器,由兩級分配器構成,大於128位元組,呼叫一級配置器,malloc free,realloc 小於128位元組,預設二級配置器,分配記憶體池。為了便於記憶體管理,減少記憶體碎片產生 3.stl 標準...

C 基礎容器

概念 代表記憶體裡一組連續的同型別儲存區可以用來把多個儲存區合併成乙個整體 陣列宣告 一維陣列 int a 10 二維陣列 int b 2 3 int a 10 是宣告 int是陣列裡元素的型別 10是陣列最多可容納的元素的個數 由於上面定義的陣列,無法實現動態擴容插入元素,因為容量有限.在c 中有...