了解空間配置器 STL關聯式容器總結

2021-10-24 10:06:08 字數 2574 閱讀 1452

一、空間配置器

1、什麼是空間配置器?

空間配置器是為了各個容器高效管理空間(實行空間申請與**)而設定的記憶體管理機制

2、為什麼需要空間配置器?

在模擬實現很多容器的時候發現很多空間都是通過new動態申請的,故:

a)動態申請的空間需要使用者自己進行釋放容易造成記憶體洩漏;

b)頻繁申請小塊記憶體容易造成記憶體碎片,影響程式執行效率;

c)malloc和new申請的空間,每塊存在額外空間浪費,且申請空間失敗沒有應對方法;

d)未考慮執行緒安全問題

3、stl空間配置器的實現原理

(2)二級空間配置器

專門負責處理小於128位元組的小塊記憶體,sgi-stl(stl的空間配置器),採用記憶體池技術來提高速度減少額外空間的浪費,利用雜湊桶來提高使用者獲取空間的速度與高效管理;

先申請一塊比較大的記憶體塊已做備用,當需要記憶體時,直接到記憶體池中去去,當池中空間不夠時,再向記憶體中去取,當使用者不用時,直接還回記憶體池即可。避免了頻繁向系統申請小塊記憶體所造成的效率低、記憶體碎片以及額外浪費的問題

1、記憶體池分配空間的流程

答:現在已經歸還的記憶體塊中找合適的塊

找到---->是否需要分割---->不需要---->直接分配

需要----->再對記憶體塊進行分割

未找到----->去記憶體池中申請

2、 當使用者需要空間時,能否直接從記憶體池中大塊空間中直接擷取?為什麼?

答:優先從鍊錶中選,先從大塊中拿,如果使用者需要大塊的空間,可能就給不了了

3、 對使用者歸還的空間能否直接拼接在大塊記憶體前?

答:不行

4、對使用者歸還的空間如何進行管理?

答:用鍊錶連線起來

5、不斷切割會有什麼後果?

答:記憶體碎片

二、stl關聯式容器總結

1、stl本質是什麼?

stl是標準模板庫,是c++高效的程式庫,採用泛型程式設計思想對常見資料結構和演算法進行封裝,並被整合到c++標準庫中去;

具體:stl包含了容器、介面卡、演算法、迭代器、仿函式以及空間配置器;(stl的六大元件)

2、stl的基本演算法

stl中的演算法主要分為兩大類:

與資料結構相關的演算法、通用演算法;

主要包含:排序、查詢、排列組合、拷貝、刪除、比較組合、運算等;

3、迭代器

typedef t* iterator;
(2)list

list的底層結構是雙向迴圈鍊錶,迭代器在移動時,只能按照鍊錶的結構前後依次移動,所以要對原生指標進行封裝,因為當迭代器++時,因該通過結點中的next指標域找到下乙個結點;

過程:a)過載*和->

b)過載++/–讓迭代器可以移動

c)過載!=/==y運算子,支援比較並可以判斷是否到達區間末尾;

4、介面卡

將乙個類的介面轉換成使用者希望的另乙個類的介面,使原本介面不相容的類可以一起工作。比如:stack和queue的底層容器為deque

5、仿函式

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 等,這些容器統一稱為序列式容器。因為其底層為線性序列的的資料結構,裡面儲存的是元素本身。關聯式容器就有所不同 關聯式容器也是用來儲存與序列式容器不同的是,裡面儲存的是結構的鍵值對,在資料檢索時比序列式容器效率更高。用...