六大元件及其關係
空間配置器、容器、迭代器、演算法、仿函式、介面卡
記憶體管理:記憶體配置和物件構造/析構分開。
使用雙層級配置器:第一級直接 malloc,free;第二級記憶體池(維護 16 個自由鍊錶)
迭代器:一種智慧型指標
vector: 動態分配的陣列,連續線性空間;
維護 3 個迭代器:start,finish,end_of_storage
無備用空間->若為 0,配置為 1,否則配置為 2 倍
需要重新配置、移動資料、釋放原空間,所以迭代器失效
list:環狀的雙向鍊錶,尾部有空白節點(為滿足左閉右開),節點不保證連續存在,迭代器不失效。內部有乙個 last 迭代器指向尾端空白節點(其 next 為 begin 迭代器)。
list 不能使用演算法 sort(只接受隨機訪問迭代器),它有自己內建的 sort。
deque:雙向開口的連續線性空間,沒有容量概念,動態地以分段連續空間組合而成, 隨時可增加新空間並鏈結起來(偽連續,負擔落在迭代器身上)
使用中控器 map,存的指標,指向實際儲存塊
迭代器失效:
a. 在deque容器首部或者尾部插入元素不會使得任何迭代器失效;
b. 在其首部或尾部刪除元素則只會使指向被刪除元素的迭代器失效;
c. 在deque容器的任何其他位置的插入和刪除操作將使指向該容器元素的所有迭代器失效。
優先佇列:使用最大堆實現,用 vector 儲存。
set:紅黑樹實現,自動排序,key=value,不允許相同的 key,不能通過迭代器改變元素 的值,insert,erase 不影響迭代器。
map:紅黑樹實現,自動排序,元素為 pair,不允許相同 key,key 不可改,value 可改, 迭代器不失效。
multiset:key 可重複,使用 insert_equal()而不是 insert_unique()
hash:沒有自動排序,使用開鏈法解決衝突,以質數計算桶個數,預先計算好 28 個質 數並儲存,需要的時候查詢「最接近某數並大於某數」的質數。
插入時可能進行**重建(元素個數》桶個數,避免單個桶太長),找下乙個質數,設立 新的 vector。
對每個舊桶,找出節點落在哪乙個新桶裡,最後交換新舊 vector,釋放舊空間。
解決衝突的方法:
線性探測
二次探測
隨機探測
雙重雜湊
再雜湊
拉鍊法紅黑樹 o(log n):1. 節點非紅即黑,2. 根為黑,3. 紅子必黑,4. null 為黑,5. 任一 節點到 null 的任何路徑所含黑節點數相同。
由規則 5,新增節點為紅,由規則 3,其父節點為黑(否則需要調整)
要點:若父為紅,檢查叔叔節點(特殊情況:空樹)
非嚴格平衡:以犧牲 search 為代價,rebalance 快(旋轉次數少)。
仿函式:函式物件,過載了 operator()
不用函式指標:1.抽象性要求; 2.函式指標無法和 stl 其他元件搭配產生靈活變化。
後台開發面試整理之C
對於一些平台,特定的資料型別只能從特定的位址進行讀取,隨意防止將導致錯誤。而更一般的情況是,如果不按照規定存放資料,將會造成讀寫效率上的損耗。比如32位的intel處理器通過匯流排訪問 包括讀和寫 記憶體資料。每個匯流排週期從偶位址開始訪問32位記憶體資料,記憶體資料以位元組為單位存放。如果乙個32...
騰訊後台開發面試總結
linux和os netstat tcpdump ipcs ipcrm 如果這四個命令沒聽說過或者不能熟練使用,基本上可以回家,通過的概率較小 這四個命令的熟練掌握程度基本上能體現面試者實際開發和除錯程式的經驗 cpu 記憶體 硬碟 等等與系統效能除錯相關的命令必須熟練掌握,設定修改許可權 tcp網...
騰訊後台開發面試經驗
面試官簡單問了下工作地點的問題後,就直入主題了,沒問專案,全是程式設計基礎和演算法,感覺問題都是隨機的,從乙個問題根據你的回答深入到下乙個問題。1.static 使用與作用 2.inline 中斷 3.程序與儲存 4.棧的兩種指標,哎,才知道原來有個ebp是幀指標啊 5.殭屍程序的理解 6.awk,...