一、空間配置器
1、什麼是空間配置器?
空間配置器是為了各個容器高效管理空間(實行空間申請與**)而設定的記憶體管理機制;2、為什麼需要空間配置器?
在模擬實現很多容器的時候發現很多空間都是通過new動態申請的,故:3、stl空間配置器的實現原理a)動態申請的空間需要使用者自己進行釋放容易造成記憶體洩漏;
b)頻繁申請小塊記憶體容易造成記憶體碎片,影響程式執行效率;
c)malloc和new申請的空間,每塊存在額外空間浪費,且申請空間失敗沒有應對方法;
d)未考慮執行緒安全問題;
(2)二級空間配置器專門負責處理小於128位元組的小塊記憶體,sgi-stl(stl的空間配置器),採用記憶體池技術來提高速度減少額外空間的浪費,利用雜湊桶來提高使用者獲取空間的速度與高效管理;
先申請一塊比較大的記憶體塊已做備用,當需要記憶體時,直接到記憶體池中去去,當池中空間不夠時,再向記憶體中去取,當使用者不用時,直接還回記憶體池即可。避免了頻繁向系統申請小塊記憶體所造成的效率低、記憶體碎片以及額外浪費的問題;1、記憶體池分配空間的流程答:現在已經歸還的記憶體塊中找合適的塊
找到---->是否需要分割---->不需要---->直接分配
需要----->再對記憶體塊進行分割
未找到----->去記憶體池中申請
2、 當使用者需要空間時,能否直接從記憶體池中大塊空間中直接擷取?為什麼?
答:優先從鍊錶中選,先從大塊中拿,如果使用者需要大塊的空間,可能就給不了了
3、 對使用者歸還的空間能否直接拼接在大塊記憶體前?
答:不行
4、對使用者歸還的空間如何進行管理?
答:用鍊錶連線起來
5、不斷切割會有什麼後果?
答:記憶體碎片
二、stl關聯式容器總結
1、stl本質是什麼?
stl是標準模板庫,是c++高效的程式庫,採用泛型程式設計思想對常見資料結構和演算法進行封裝,並被整合到c++標準庫中去;2、stl的基本演算法具體:stl包含了容器、介面卡、演算法、迭代器、仿函式以及空間配置器;(stl的六大元件)
stl中的演算法主要分為兩大類:3、迭代器與資料結構相關的演算法、通用演算法;
主要包含:排序、查詢、排列組合、拷貝、刪除、比較組合、運算等;
typedef t* iterator;
(2)list4、介面卡list的底層結構是雙向迴圈鍊錶,迭代器在移動時,只能按照鍊錶的結構前後依次移動,所以要對原生指標進行封裝,因為當迭代器++時,因該通過結點中的next指標域找到下乙個結點;
過程:a)過載*和->
b)過載++/–讓迭代器可以移動
c)過載!=/==y運算子,支援比較並可以判斷是否到達區間末尾;
將乙個類的介面轉換成使用者希望的另乙個類的介面,使原本介面不相容的類可以一起工作。比如:stack和queue的底層容器為deque5、仿函式1、什麼是仿函式?
仿函式是一種具有函式特徵的物件,呼叫者可以像呼叫函式一樣的呼叫該物件,且該物件必須自定義函式呼叫運算子()(過載小括號),即可在仿函式物件的後面加上一對小括號,以此呼叫仿函式所定義的operator()操作;2、寫法舉例:#include
#include
class
mul2};
class
mod3
};
STL之關聯式容器
sets 沒有重疊的數字,沒有權利指定新元素的位置 set typedef std set obj obj col col.insert 3 col.insert 1 col.insert 5 col.insert 4 col.insert 1 col.insert 6 col.insert 2 f...
STL關聯式容器(二)
前面我們總結了map的用法,具體參考如下 stl關聯式容器 一 接下來我們看看multimap multimap是關聯式容器,它按照特定的順序,儲存由key和value對映成的鍵值對,其中多個鍵值對之間的key是可以重複的。multimap在底層用二叉搜尋樹 紅黑樹 來實現。multimap和map...
STL之關聯式容器
在接觸容器初,我們學習了stl中的部分容器,如 vector,list,deque 等,這些容器統一稱為序列式容器。因為其底層為線性序列的的資料結構,裡面儲存的是元素本身。關聯式容器就有所不同 關聯式容器也是用來儲存與序列式容器不同的是,裡面儲存的是結構的鍵值對,在資料檢索時比序列式容器效率更高。用...