1. 程式人生 > >1、【C++ SLT】簡介

1、【C++ SLT】簡介

一、基本概念

    STL(Standard Template Library),即標準模板庫,是一個具有工業強度的,高效的C++程式庫。它被容納於C++標準程式庫(C++ Standard Library)中,是ANSI/ISO C++標準中最新的也是極具革命性的一部分。該庫包含了諸多在電腦科學領域裡所常用的基本資料結構和基本演算法。為廣大C++程式設計師們提供了一個可擴充套件的應用框架,高度體現了軟體的可複用性。

    從邏輯層次來看,在STL中體現了泛型化程式設計的思想(generic programming),引入了諸多新的名詞,比如像需求(requirements),概念(concept),模型(model),容器(container),演算法(algorithmn),迭代子(iterator)等。與OOP(object-oriented programming)中的多型(polymorphism)一樣,泛型也是一種軟體的複用技術。

    從實現層次看,整個STL是以一種型別引數化(type parameterized)的方式實現的,這種方式基於一個在早先C++標準中沒有出現的語言特性–模板(template)。如果查閱任何一個版本的STL原始碼,你就會發現,模板作為構成整個STL的基石是一件千真萬確的事情。除此之外,還有許多C++的新特性為STL的實現提供了方便。

二、STL的六大元件

    (1)容器(Container),是一種資料結構,如list,vector,和deques ,以模板類的方法提供。為了訪問容器中的資料,可以使用由容器類輸出的迭代器;

    (2)迭代器(Iterator),提供了訪問容器中物件的方法。例如,可以使用一對迭代器指定list或vector中的一定範圍的物件。迭代器就如同一個指標。事實上,C++的指標也是一種迭代器。但是,迭代器也可以是那些定義了operator*()以及其他類似於指標的操作符地方法的類物件;

    (3)演算法(Algorithm),是用來操作容器中的資料的模板函式。例如,STL用sort()來對一個vector中的資料進行排序,用find()來搜尋一個list中的物件,函式本身與他們操作的資料的結構和型別無關,因此他們可以在從簡單陣列到高度複雜容器的任何資料結構上使用;

    (4)仿函式(Function object,仿函式(functor)又稱之為函式物件(function object),其實就是過載了()操作符的struct,沒有什麼特別的地方

    (5)介面卡(Adaptor)

    (6)空間配製器(allocator)其中主要工作包括兩部分1.物件的建立與銷燬 2.記憶體的獲取與釋放

    STL六大元件之間的關係:容器通過配置器取得資料儲存空間,演算法通過迭代器獲取容器內容,仿函式可以協助演算法完成不同的策略變化,介面卡可以修飾或套界仿函式。

1、STL容器

    (1)序列式容器(Sequence containers),每個元素都有固定位置--取決於插入時機和地點,和元素值無關。常見的序列式容器有:vector、deque、list。

    Vector:將元素置於一個動態陣列中加以管理,可以隨機存取元素(用索引直接存取),陣列尾部新增或移除元素非常快速。但是在中部或頭部安插元素比較費時;

    Deque:是“double-ended queue”的縮寫,可以隨機存取元素(用索引直接存取),陣列頭部和尾部新增或移除元素都非常快速。但是在中部或頭部安插元素比較費時;

    List:雙向連結串列,不提供隨機存取(按順序走到需存取的元素,O(n)),在任何位置上執行插入或刪除動作都非常迅速,內部只需調整一下指標;

    (2)關聯式容器(Associated containers),元素位置取決於特定的排序準則,和插入順序無關。常見的關聯式容器有:set、multiset、map、multimap。

    Sets/Multisets:內部的元素依據其值自動排序,Set內的相同數值的元素只能出現一次,Multisets內可包含多個數值相同的元素,內部由二叉樹實現(實際上基於紅黑樹(RB-tree)實現),便於查詢;

    Maps/Multimaps:Map的元素是成對的鍵值/實值,內部的元素依據其值自動排序,Map內的相同數值的元素只能出現一次,Multimaps內可包含多個數值相同的元素,內部由二叉樹實現(實際上基於紅黑樹(RB-tree)實現),便於查詢;

    另外有其他容器:hash_map、hash_set、hash_multiset、hash_multimap。

容器的比較:

2、STL迭代器

(1)迭代器定義

    迭代器(iterator):扮演容器與演算法之間的膠合劑,是所謂的“泛型指標”。
  
  迭代器模式:提供一種方法,使之能夠依序尋訪某個聚合物(容器)所含的各個元素,而又無需暴露該聚合物的內部表達方式。
  
  STL的中心思想在於:將資料容器和演算法分開,彼此獨立設計,最後再以一貼膠著劑(iterator)將它們撮合在一起。
  
  STL的迭代器是一個可遍歷STL容器全部或者部分資料的智慧指標。
  
(2)迭代器原理

    迭代器是一種行為類似智慧指標的物件,而指標最常見的行為就是內容提領和成員訪問。因此迭代器最重要的行為就是對operator*和operator->進行過載。

3、STL演算法

    STL演算法部分主要由標頭檔案<algorithm>、<numeric>、<functional>組成。要使用 STL中的演算法函式必須包含標頭檔案<algorithm>,對於數值演算法須包含<numeric>、<functional>中則定義了一些模板類,用來宣告函式物件。

STL中演算法大致分為七類

    1)非可變序列演算法:指不直接修改其所操作的容器內容的演算法。

    2)可變序列演算法:指可以修改它們所操作的容器內容的演算法。

    3)排序演算法:包括對序列進行排序和合並的演算法、搜尋演算法以及有序序列上的集合操作。

    4)數值演算法:對容器內容進行數值計算。

    5)變值演算法

    6)刪除演算法

    7)有序區間演算法

4、介面卡

(1)基本概念

    介面卡, 在STL中扮演著轉換器的角色,本質上是一種設計模式,用於將一種介面轉換成另一種介面,從而是原本不相容的介面能夠很好地一起運作。
  
(2)基本型別

根據目標介面的型別,介面卡可分為以下幾類:

    1. 改變容器的介面,稱為容器介面卡;

    2. 改變迭代器的介面,稱為迭代器介面卡;

    3. 改變仿函式的介面,稱為仿函式介面卡。

5.仿函式

    仿函式又稱函式物件,它本質上是 一種具有函式特質的物件,它過載了operator()運算子,我們可以像使用函式一樣使用該物件。

(1)仿函式的作用

    在C++的STL提供的各種演算法,例如sort()。往往有兩個版本,其中一個是最長用的某種運算的版本(operator<);第二個版本則表現出最泛化的演算流程,允許使用者“以template引數來指定所需要採取的策略”。
(2)仿函式產生的原因

    由於函式指標畢竟不能滿足STL對抽象物件的需求,也不能滿足軟體積木的需求——函式指標無法和STL其它元件(如配接器adapter)搭配使用,產生更靈活的變化。

6.空間配製器

    其中主要工作包括兩部分1.物件的建立與銷燬 2.記憶體的獲取與釋放

有關控制元件配置器的相關內容參見部落格:https://blog.csdn.net/xy913741894/article/details/66974004