C++ STL介紹——簡介


@

1、什么是STL

    STLStandard Template Library,即標准模板庫,是一個具有工業強度的,高效的C++ 程序庫。它被容納於C++ 標准程序庫C++ Standard Library中,是ANSI/ISO C++ 標准中最新的也是極具革命性的一部分。該庫包含了諸多在計算機科學領域里所常用的基本數據結構和基本算法。為廣大C++程序員們提供了一個可擴展的應用框架,高度體現了軟件的可復用性。

    STL的一個重要特點是數據結構和算法的分離。盡管這是個簡單的概念,但這種分離確實使得STL變得非常通用。例如,由於STL的sort()函數是完全通用的,你可以用它來操作幾乎任何數據集合,包括鏈表,容器和數組;
    STL另一個重要特性是它不是面向對象的。為了具有足夠通用性,STL主要依賴於模板而不是封裝,繼承和虛函數(多態性)——OOP的三個要素。你在STL中找不到任何明顯的類繼承關系。這好像是一種倒退,但這正好是使得STL的組件具有廣泛通用性的底層特征。另外,由於STL是基於模板,內聯函數的使用使得生成的代碼短小高效;

    從邏輯層次來看,在STL中體現了泛型化程序設計的思想,引入了諸多新的名詞,比如像需求requirements,概念concept,模型model,容器container,算法algorithmn,迭代子iterator等。與OOPobject-oriented programming中的多態polymorphism一樣,泛型也是一種軟件的復用技術;
    從實現層次看,整個STL是以一種類型參數化的方式實現的,這種方式基於一個在早先C++標准中沒有出現的語言特性--模板template

2、STL中六大組件

    1. 容器(Container),是一種數據結構,如listvector,和deques ,以模板類的方法提供。為了訪問容器中的數據,可以使用由容器類輸出的迭代器;
    2. 迭代器(Iterator),提供了訪問容器中對象的方法。例如,可以使用一對迭代器指定listvector中的一定范圍的對象。迭代器就如同一個指針。事實上,C++的指針也是一種迭代器。但是,迭代器也可以是那些定義了operator*()以及其他類似於指針的操作符地方法的類對象;
    3. 算法(Algorithm),是用來操作容器中的數據的模板函數。例如,STL用sort()來對一個vector中的數據進行排序,用find()來搜索一個list中的對象,函數本身與他們操作的數據的結構和類型無關,因此他們可以在從簡單數組到高度復雜容器的任何數據結構上使用;
    4. 仿函數(Functor)
    5. 適配器(Adaptor)
    6. 分配器(allocator)

2.1 容器(Container)

STL中的容器有隊列容器和關聯容器,容器適配器(congtainer adapters:stack,queue,priority queue),位集(bit_set),串包(string_package)等等。

2.1.1 序列式容器(Sequence containers)

序列式容器每個元素都有固定位置——取決於插入時機和地點,和元素值無關,vector、deque、list;

    vector : 將元素置於一個動態數組中加以管理,可以隨機存取元素(用索引直接存取),數組尾部添加或移除元素非常快速。但是在中部或頭部安插元素比較費時;
    Deque : 是double-ended queue的縮寫,可以隨機存取元素(用索引直接存取),數組頭部和尾部添加或移除元素都非常快速。但是在中部或頭部安插元素比較費時;
    List : 雙向鏈表,不提供隨機存取(按順序走到需存取的元素,O(n)),在任何位置上執行插入或刪除動作都非常迅速,內部只需調整一下指針;

2.1.2 關聯式容器(Associated containers)

元素位置取決於特定的排序准則,和插入順序無關,set、multiset、map、multimap等。

    Set/Multiset : 內部的元素依據其值自動排序,Set內的相同數值的元素只能出現一次,Multisets內可包含多個數值相同的元素,內部由二叉樹實現,便於查找;
    Map/Multimap : Map的元素是成對的鍵值/實值,內部的元素依據其值自動排序,Map內的相同數值的元素只能出現一次,Multimaps內可包含多個數值相同的元素,內部由二叉樹實現,便於查找;

容器類自動申請和釋放內存,無需new和delete操作。

2.2 迭代器(Iterator)

Iterator(迭代器)模式又稱Cursor(游標)模式,用於提供一種方法順序訪問一個聚合對象中各個元素, 而又不需暴露該對象的內部表示。或者這樣說可能更容易理解:Iterator模式是運用於聚合對象的一種模式,通過運用該模式,使得我們可以在不知道對象內部表示的情況下,按照一定順序(由iterator提供的方法)訪問聚合對象中的各個元素。

迭代器的作用:能夠讓迭代器與算法不干擾的相互發展,最后又能無間隙的粘合起來,重載了*,++,==,!=,=運算符。用以操作復雜的數據結構,容器提供迭代器,算法使用迭代器;常見的一些迭代器類型:iteratorconst_iteratorreverse_iteratorconst_reverse_iterator.

2.3 算法(Algorithm)

    STL提供了大約100個實現算法的模版函數,比如算法for_each將為指定序列中的每一個元素調用指定的函數,stable_sort以你所指定的規則對序列進行穩定性排序等等。只要我們熟悉了STL之后,許多代碼可以被大大的化簡,只需要通過調用一兩個算法模板,就可以完成所需要的功能並大大地提升效率。
算法部分主要由頭文件 <algorithm><numeric><functional> 組成:

1、<algorithm> 是所有STL頭文件中最大的一個(盡管它很好理解),它是由一大堆模版函數組成的,可以認為每個函數在很大程度上都是獨立的,其中常用到的功能范圍涉及到比較、交換、查找、遍歷操作、復制、修改、移除、反轉、排序、合並等等。
2、<numeric> 體積很小,只包括幾個在序列上面進行簡單數學運算的模板函數,包括加法和乘法在序列上的一些操作。
3、<functional> 中則定義了一些模板類,用以聲明函數對象。

STL中算法大致分為四類:

1、非可變序列算法:指不直接修改其所操作的容器內容的算法。
2、可變序列算法:指可以修改它們所操作的容器內容的算法。
3、排序算法:對序列進行排序和合並的算法、搜索算法以及有序序列上的集合操作。
4、數值算法:對容器內容進行數值計算。

### 2.4 仿函數(Functor)     仿函數(functor),就是使一個類的使用看上去象一個函數。其實現就是類中實現一個operator(),這個類就有了類似函數的行為,就是一個仿函數類了。     有些功能的的代碼,會在不同的成員函數中用到,想復用這些代碼:
1、公共的函數,可以,這是一個解決方法,不過函數用到的一些變量,就可能成為公共的全局變量,再說為了復用這么一片代碼,就要單立出一個函數,也不是很好維護。
2、仿函數,寫一個簡單類,除了那些維護一個類的成員函數外,就只是實現一個operator(),在類實例化時,就將要用的,非參數的元素傳入類中。
                                                             
算術類仿函數 關系運算類仿函數 邏輯運算仿函數
加:plus<T> 等於:equal_to<T> 邏輯與:logical_and<T>
減:minus<T> 不等於:not_equal_to<T> 邏輯或:logical_or<T>
乘:multiplies<T> 大於:greater<T> 邏輯否:logical_no<T>
除:divides<T> 大於等於:greater_equal<T>
模取:modulus<T> 小於:less<T>
否定:negate<T> 小於等於:less_equal<T>

### 2.5 適配器(Adaptor)      標准庫提供了三種順序容器適配器:``queue(FIFO隊列)``、``priority_queue(優先級隊列)``、``stack(棧)`` 要使用適配器,需要加入一下頭文件: ``` #include //stack #include //queue、priority_queue ```
## 3、其他部分鏈接 [1、C++ STL介紹——String類](https://www.cnblogs.com/lanxiang/p/11252404.html)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM