**
容器、迭代器、分配器、演算法、仿函式、配接器。
分配器給容器分配記憶體空間,演算法通過迭代器獲取容器中內容,仿函式協助演算法完成各種操作,配接器用來套接適配仿函式。
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。字尾可以是大寫或者小寫,多個字尾以任意順序進行組合...