STL全稱(chēng)是Standard Template Library,它屬于泛型編程的范疇(泛型編程的代表性作品),泛型編程旨在編寫(xiě)?yīng)毩⒂跀?shù)據(jù)類(lèi)型的代碼,也就是說(shuō)代碼中的數(shù)據(jù)類(lèi)型只有在編譯的時(shí)候才會(huì)確定,否則為一個(gè)占位符。
在網(wǎng)站設(shè)計(jì)制作、網(wǎng)站制作中從網(wǎng)站色彩、結(jié)構(gòu)布局、欄目設(shè)置、關(guān)鍵詞群組等細(xì)微處著手,突出企業(yè)的產(chǎn)品/服務(wù)/品牌,幫助企業(yè)鎖定精準(zhǔn)用戶(hù),提高在線咨詢(xún)和轉(zhuǎn)化,使成都網(wǎng)站營(yíng)銷(xiāo)成為有效果、有回報(bào)的無(wú)錫營(yíng)銷(xiāo)推廣。創(chuàng)新互聯(lián)專(zhuān)業(yè)成都網(wǎng)站建設(shè)十載了,客戶(hù)滿(mǎn)意度97.8%,歡迎成都創(chuàng)新互聯(lián)客戶(hù)聯(lián)系。C++的STL中包含了各種常用的數(shù)據(jù)結(jié)構(gòu)類(lèi)模板以及操作這些數(shù)據(jù)結(jié)構(gòu)的泛型算法。
二.STL的六大組件 2.1 概述STL包含六大組件:容器(Containers)、分配器(Allocators)、算法(Algorithms)、迭代器(Iterators)、函數(shù)對(duì)象(Functor Objects)和適配器(Adapters),其中函數(shù)對(duì)象也被稱(chēng)之為仿函數(shù)(Functors)。
STL六大組件的交互關(guān)系如下圖所示:
圖源自侯捷老師的《STL源碼剖析》,侵權(quán)刪。
從上圖可以看出,STL中最重要的兩種組件為容器和算法,剩下的組件都服務(wù)于這兩者。分配器主要用來(lái)為容器分配存儲(chǔ)空間;迭代器則用來(lái)遍歷容器,方便算法的調(diào)用;函數(shù)對(duì)象則用來(lái)協(xié)助算法完成不同的策略變化;適配器可以修飾容器或函數(shù)對(duì)象。
2.2 容器容器是用來(lái)存放數(shù)據(jù)的,STL定義了各種常用的數(shù)據(jù)結(jié)構(gòu)來(lái)對(duì)存放的數(shù)據(jù)進(jìn)行組織。C++的容器大致分類(lèi)如下:
其中:
2.3 分配器均攤時(shí)間復(fù)雜度指某些操作的時(shí)間復(fù)雜度較高,但操作后使得數(shù)據(jù)的組成狀況得以改善,使得后續(xù)系列操作的時(shí)間復(fù)雜度降低。
分配器主要用來(lái)為容器分配和釋放存儲(chǔ)空間。STL為容器提供了默認(rèn)分配器std::allocator
,但用戶(hù)也可以通過(guò)模板參數(shù)來(lái)指定其它分配器或自定義的分配器(一般沒(méi)這個(gè)必要)。
通過(guò)迭代器可以訪問(wèn)容器中的元素,其充當(dāng)著容器與算法間的橋梁。
所有容器都有對(duì)應(yīng)的迭代器,STL中迭代器可以分為下圖所示的5類(lèi):
箭頭代表迭代器之間存在繼承關(guān)系。
迭代器類(lèi)型 | 說(shuō)明 |
---|---|
Input(輸入迭代器) | 支持向前迭代遍歷元素以及對(duì)元素的讀取 |
Forward(正向迭代器) | 支持向前迭代遍歷元素以及對(duì)元素的讀寫(xiě) |
Bidirectional(雙向迭代器) | 支持向前/向后迭代遍歷元素以及對(duì)元素的讀寫(xiě) |
Random Access(隨機(jī)訪問(wèn)迭代器) | 支持隨機(jī)訪問(wèn)任意位置的元素以及對(duì)元素的讀寫(xiě) |
Output(輸出迭代器) | 支持向前迭代遍歷元素以及對(duì)元素的寫(xiě)入 |
算法通過(guò)迭代器來(lái)對(duì)容器中的元素進(jìn)行排序、計(jì)數(shù)、搜索等操作。
STL中的容器都可以使用相同的算法。需要注意的是,某些特定類(lèi)型的容器可能也定義了進(jìn)行過(guò)特殊優(yōu)化的算法,因此,若容器中實(shí)現(xiàn)了相應(yīng)的算法,則推薦使用容器自帶的,否則才考慮使用通用的算法。
2.6 函數(shù)對(duì)象函數(shù)對(duì)象是某種class的實(shí)例對(duì)象,這類(lèi)class重載了函數(shù)調(diào)用運(yùn)算符()
,使得函數(shù)對(duì)象可以被當(dāng)作一般函數(shù)來(lái)使用。
STL提供了許多內(nèi)置的函數(shù)對(duì)象來(lái)幫助函數(shù),其大致可以分為:
plus
、minus
less
、greater
logical_and
適配器主要用來(lái)修飾容器或函數(shù),適配器主要包括容器適配器和函數(shù)適配器。
2.7.1 容器適配器注意還有迭代器適配器,但一般很少用上,所以略過(guò)。
容器適配器指將對(duì)容器進(jìn)行封裝,并重新對(duì)容器包含的成員函數(shù)進(jìn)行組合,從而提供某些特定數(shù)據(jù)結(jié)構(gòu)的功能。
STL中常見(jiàn)的容器適配器包括:
deque
deque
vector
函數(shù)適配器能改變函數(shù)或函數(shù)對(duì)象的行為。例如將函數(shù)對(duì)象的參數(shù)綁定至某個(gè)特殊值,使得二元參數(shù)函數(shù)對(duì)象變?yōu)橐辉獏?shù)函數(shù)對(duì)象。
三.示例代碼包含STL六大組件的栗子如下:
#include#include#include
#includeusing namespace std;
int main()
{vector>arr = {12, 45, 110, 2, 77, 44, 8 };
cout<< count_if(arr.begin(), arr.end(),
not1(bind2nd(less(), 35)))<< endl;
return 0;
}
在上述代碼中:
vector
,并顯式調(diào)用了STL的默認(rèn)分配器allocator
。count_if
是STL實(shí)現(xiàn)的統(tǒng)計(jì)符合某種條件的算法函數(shù)。begin()
表示指向容器的第一個(gè)元素,end()
指向容器最后一個(gè)元素的后一個(gè)位置,即左閉右開(kāi)。less
為實(shí)現(xiàn)x< y
關(guān)系運(yùn)算的函數(shù)對(duì)象。not1
和bind2nd
表示函數(shù)適配器,bind2nd
表示將關(guān)系運(yùn)算函數(shù)對(duì)象的第二個(gè)參數(shù)y
綁定為35,not1
表示對(duì)一元函數(shù)對(duì)象的真假值取反。本文的完成參考了如下資料:
以上便是本文的全部?jī)?nèi)容,若有任何錯(cuò)誤請(qǐng)批評(píng)指正?。。?/p>
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
網(wǎng)頁(yè)名稱(chēng):STL剖析(一):體系結(jié)構(gòu)概覽-創(chuàng)新互聯(lián)
網(wǎng)站路徑:http://jinyejixie.com/article14/djeoge.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營(yíng)銷(xiāo)、微信小程序、ChatGPT、域名注冊(cè)、外貿(mào)建站、小程序開(kāi)發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容