天天看點

初識 STL

一、概念

STL中文名叫标準模闆庫,是C++标準庫的重要組成部分,是一些“容器”的集合,這些“容器”有list,vector,set,map等,不僅是一個可複用的元件庫,而且是一個包羅資料結構與算法的軟體架構,STL的目的是标準化元件,這樣就不用重新開發,可以使用現成的元件。

二、版本

原始版本:Alexander Stepanov、Meng Lee 在惠普實驗室完成的原始版本。

P. J. 版本:由P. J. Plauger開發,繼承自HP版本,被Windows Visual C++采用,不能公開或修改,可讀性比較低, 符号命名比較怪異。

RW版本:由Rouge Wage公司開發,繼承自HP版本,被C++ Builder 采用,不能公開或修改,可讀性一般。

SGI版本:由Silicon Graphics Computer Systems,Inc公司開發,繼承自HP版本,被gcc(Linux)采用,可移植性好, 可公開、修改,可讀性高。

三、六大元件

1. 容器 :各種資料結構

線性結構:現行容器

樹形結構:樹形結構的容器

哈希結構:哈希結構的容器

2. 通用的算法(sort,search,copy,erase等):與資料類型無關,與資料結構無關

3. 疊代器:類似與指針,容器與算法之間的膠合劑,疊代器是一種将 operator*、operator->、operator++、operator- - 等指針相關操作進行重載的class template,所有STL容器都有自己專屬的疊代器,隻有容器本身才知道如何周遊自己的元素,原生指也是一種疊代器。

4. 配接器(stack,queue):一種用來修飾容器、仿函數、疊代器接口的東西

5. 函數對象(仿函數):行為類似函數,可作為算法的某種政策,從實作的角度來看,仿函數是一種重載了operator()的class或class template,一般的函數指針也可視為狹義的仿函數

6、配置器(allocators):負責空間配置與管理

容器通過配置器取得資料儲存空間,算法通過疊代器存取容器内容,仿函數可以協助算法完成不同的政策變化,配接器可以修飾或套接仿函數。

四、缺陷

1. 不支援線程安全,并發環境下需要我們自己加鎖,鎖的粒度是比較大 

2. STL極度的追求效率,導緻内部比較複雜,比如類型萃取,疊代器萃取

3. STL的使用會有代碼膨脹的問題,比如使用vector/vector/vector這樣會生成多份代碼