C 高階知識整理

2022-08-30 07:33:08 字數 2483 閱讀 8069

**

容器、迭代器、分配器、演算法、仿函式、配接器。

分配器給容器分配記憶體空間,演算法通過迭代器獲取容器中內容,仿函式協助演算法完成各種操作,配接器用來套接適配仿函式。

vector:

連續儲存容器,動態陣列,在堆上分配空間。

底層實現:陣列。

兩倍容量增長:

插入新元素時,如果超過容量,則會重新分配原有個數的兩倍空間,將原空間元素賦值到新空間再增加新元素,最後析構並釋放原空間,之前的迭代器失效

適用:隨機訪問,不常在非尾節點插入刪除。

list:

動態鍊錶,在堆上分配空間。插入和刪除都會分配或釋放空間。

底層實現:雙向鍊錶。

適用:不能隨機訪問,只能快速訪問頭尾節點。

resize:改變容器內含有元素的數量(size()),可以縮小。

reserve:改變當前容器的最大容量(capicity()),不能縮小。

map和set都是關聯容器,底層實現都是紅黑樹。map和set的介面紅黑樹都提供了。

區別:1. map是key-value(關鍵字-值):關鍵字起索引作用,值是和索引關聯的資料。set是關鍵字的集合。

2. set迭代器為const,不能修改元素的值(關鍵字不能修改);map可以修改value,不能修改key。map和set是根據關鍵字排序來保證其有序。修改key則應刪除鍵,調節平衡,再插入鍵,調節平衡,會破壞結構導致迭代器iterator失效。

3.map支援下標操作,set不支援下標操作。map使用key做下標去查詢,如果key不存在,則插入該關鍵字和值到map中。只希望確定某一關鍵值是否存在則應該使用find。

迭代器是類模板,過載了指標的操作符部分操作符,是乙個可遍歷stl容器內全部或部分元素的物件,本質是封裝了原生指標,提供了比指標更高階的行為,相當於一種智慧型指標,可以根據不能型別的容器來實現不同的++,--等操作。

迭代器返回的是物件引用而不是值,cout智慧型輸出迭代器使用*解引用後的值。

迭代器訪問方式就是將不同集合類的訪問邏輯抽象出來,使得不用暴露內部結構而達到迴圈遍歷集合的效果。

stl分配器用於封裝stl容器在記憶體管理上的底層細節。

alloc::allocate()負責分配記憶體,alloc::deallocate()釋放空間。物件構造由construct()負責,析構由destroy()負責。

採用兩級配置器,分配空間大小超過128b時使用第一級空間配置器,小於128b時第二級。第一級空間配置器使用malloc、realloc、free進行記憶體分配和釋放;第二級採用記憶體池計數,通過空閒鍊錶來管理記憶體。

1.vector、deque,使用erase後,後面每個元素迭代器都會失效,後面每個元素向前移動乙個位置,erase返回下乙個有效迭代器。

2.map、set,使用erase後,當前迭代器失效,不會影響下乙個元素迭代器,在呼叫erase前記錄下乙個迭代器即可。

3.list不會失效,呼叫erase會返回下乙個有效迭代器。

通過public、protected、private關鍵字來控制成員變數和成員函式的訪問許可權。在類的內部都可以互相訪問。在類的外部,只能通過物件訪問public屬性成員,子類物件可以訪問public和protected成員。

strct和class都可以定義類,但struct預設許可權都是public,class則是private。

struct和class記憶體對齊,空類的大小為1。

類中有虛函式時,會有乙個指向虛函式表的指標(vptr),32位系統下指標大小為4。

靜態資料成員是在全域性/靜態區,不影響類的大小。

派生類則是基類大小加自身成員大小。

union共享記憶體,所以為最大成員變數的記憶體。

對齊:各資料型別對齊值不同:char對齊值為1,short為2,int float double為4。

結構體或類自身對齊值為成員中對齊值最大的那個值。

資料成員有效對齊值:自身對齊值和指定對齊值中小的那個值。

右值指即將消散的值(臨時變數或即將析構的物件或匿名物件),右值引用則實現了轉移語義,將右值轉移到其他變數上。

主要目的:1.消除兩個物件互動時不必要的拷貝,提高效率(移動建構函式)

2.能夠更簡潔明確定義泛型函式。

預處理階段:將源**中檔案包含關係(標頭檔案)、預編譯語句進行分析和替換,生成預編譯檔案。

編譯階段:將預處理過的預編譯檔案轉換成特定彙編**,生成彙編檔案。

彙編階段:將編譯階段生成的彙編檔案轉換為機器滿,生成二進位制可重定位檔案。

鏈結發生在編譯、程式被載入以及程式執行時,主要工作是符號解析和重定位

lib在編譯時鏈結,而動態庫在執行時鏈結。

如果有dll檔案,則lib記錄dll中函式入口和位置,dll則是函式具體內容。

區別:編譯器預處理階段查詢標頭檔案路徑不同。

使用雙引號查詢順序:

當前頭檔案目錄

編譯器設定的標頭檔案路徑

編譯器設定的標頭檔案路徑

使用尖括號則只包含後兩步。

先使用快排分段,資料量小於16則進行插入排序,遞迴程度深則使用堆排序。

C 語言知識整理

c 語言知識整理 前言 c語言語法即關鍵字的使用方法 1.關鍵字介紹如何處理01 記憶體意識 1.關鍵字分類 2.變數符號實質宣告 定義 賦值 3.型別符號的使用struct union enum typedef 4.符號修飾關鍵字extern volatile static const restr...

C語言知識整理

編碼 float編碼 高8位存階碼,低24位存尾數 int編碼 用補碼 正數的原碼,反碼,補碼相同 例如 7 0111 負數的原碼 7 1111 反碼 1000 除了第乙個符號位不變,其他取反 補碼 1001 反碼加一 其中,負數的符號位為1,整數為0.三目操作符 a b a b 式1成立則去式2,...

C 常量知識整理

整數常量可以是十進位制 八進位制或十六進製制的常量。字首指定基數 0x 或 0x 表示十六進製制,0 表示八進位制,沒有字首則表示十進位制。整數常量也可以有字尾,可以是 u 和 l 的組合,其中,u 和 l 分別表示 unsigned 和 long。字尾可以是大寫或者小寫,多個字尾以任意順序進行組合...