STL原始碼解析1 六大元件關係

2021-06-25 21:06:08 字數 2342 閱讀 6142

一. stl六大元件介紹

stl就是

容器類+演算法實現+迭代器+配接器+仿函式+配置器

.容器通過配置器取得資料儲存空間,演算法通過迭代器訪問容器內容,仿函式可以協助演算法完成不同的策略變化,配接器可以修飾或套界仿函式

1. 容器

stl容器包含兩種:序列式容器主要有vector、list、deque,以及關聯式容器主要有set、map、multiset、multimap。

容器主要是用來存放資料的,從實現的角度來看容器是一種class template(類模板)。

2. 演算法

stl包含演算法主要有sort、search、copy、erase、find等,從實現的角度來說演算法是一種function template(函式模板)

注意乙個問題:任何的乙個stl演算法,都需要獲得由一對迭代器所標示的區間,用來表示操作範圍。這一對迭代器所標示的區間都是前閉後開區間,例如[first, last)。也就是說實際上,整個區間是從first開始到last-1,迭代器last指的是最後乙個元素的下乙個位置。在stl中所有區間都是採用前閉後開,這樣可以帶來很多方便。

3. 迭代器

stl中迭代器主要用來把容器和演算法結合起來,扮演容器與演算法之間的膠合劑,是所謂的「泛型指標」。從實現的角度看迭代器是一種將operator*、operator->、operator++、operator--等指標操作過載的class template(類模板)。所有的stl容器都有自己的迭代器,只有容器本身才知道如何遍歷自身的元素。

迭代器有五種型別:input、output、forward、bidirectional和random iterator。

4. 仿函式

仿函式是一種行為類似函式,但是實際是過載了operator()的class或class template(類模板),一般函式指標可視為狹義的仿函式。

下面是乙個過載函式的例子:

[cpp]view plain

copy

#include

#include

using

namespace

std;  

class

a  };  

intmain()  

/*輸出

7 */

5. 介面卡

介面卡主要用來修飾容器介面、迭代器介面或仿函式介面的東西;

stl提供了stack、queue兩種容器介面卡,stack和queue的底層完全是由deque來實現的。

改變容器介面的稱為容器介面卡、改變迭代器介面的稱為迭代器介面卡、改變仿函式介面的稱為仿函式介面卡。

容器配接器(container adapter):改變容器介面。

迭代器配接器(iterator adapter):改變迭代器介面。

仿函式配接器(function adapter):改變仿函式介面。

6. 空間配置器

stl的空間配置器主要用來給容器進行空間的配置與管理,從實現的角度來說空間配置器是實現了乙個動態分配空間、空間管理、空間釋放的class template(類模板)。

(1)容器預設的配置器為alloc,而非allocator。(兩者區別,之後介紹)

(2)stl 將記憶體空間的配置/釋放和物件內容的構造/析構分開,由不同操作負責。

記憶體配置操作由alloc:;alllocate()負責,記憶體釋放由alloc::deallocate()負責;

物件構造由::construct()負責,物件析構由::destroy()負責。

(3)記憶體空間採用雙層級配置器。第一級使用malloc()和free(),第二級則視不同的情況採取不同的策略,當配置區域塊超過128bytes時,呼叫第一級配置器;當配置區域小於128byte時,採用memory pool整理方式。因為在小額區太多時,配置時負擔也重,所以在小區域時用的策略也多。

(4)二級配置器,主動將小額區塊的記憶體需求上調至8的倍數,並維護16個freelists,各自管理大小分別為8、16、24、32…128bytes的小額區塊。

二. stl六大元件的互動關係

容器通過空間配置器取得資料儲存空間;演算法利用迭代器向容器訪問資料;仿函式協助演算法完成不同的策略;介面卡可以用來修改容器、迭代器或仿函式的介面;

寫這幾種關係的時候自己也還是有很多不懂得地方,但是之後會對這幾部分做分別介紹,一定得了解了,才能更好地使用!

《STL原始碼剖析》學習 六大元件

stl 提供了六大元件,分別為 容器 演算法 迭代器 仿函式 介面卡和配置器。容器通過配置器取得資料儲存空間,演算法通過迭代器訪問容器的內容,仿函式可以協助演算法完成不同的策略,配接器可以修飾或者巢狀仿函式。下面分別簡單介紹 1.容器 container 各種資料結構 根據資料排列方式分為序列式和關...

STL 原始碼分析六大元件 allocator

1.allocator 基本介紹 分配器 allocator 是c 標準庫的乙個元件,主要用來處理所有給定容器 vector,list,map等 記憶體的分配和釋放。c 標準庫提供了預設使用的通用分配器std allocator,但是,也可以由程式設計師自己提供自定義分配器。2.allocator ...

STL中六大元件的關係

六大元件 容器 containers 各種資料結構,如 vector,list,deque,set,map,用來存放 元素 就是template class。演演算法 algorithms 各種常用演演算法如 sort,search,copy,erase,就是template class。迭代器 i...