日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

STL簡介

 Coder編程 2021-05-15

一、基本概念

STL(Standard Template Library,標準模板庫)是惠普實驗室開發(fā)的一系列軟件的統(tǒng)稱?,F(xiàn)然主要出現(xiàn)在C++中,但在被引入C++之前該技術(shù)就已經(jīng)存在了很長的一段時間。

STL的從廣義上講分為三類:algorithm(算法)、container(容器)和iterator(迭代器),容器和算法通過迭代器可以進行無縫地連接。幾乎所有的代碼都采 用了模板類和模板函數(shù)的方式,這相比于傳統(tǒng)的由函數(shù)和類組成的庫來說提供了更好的代碼重用機會。

在C++標準中,STL 就位于各個 C++ 的頭文件中,即它并非以二進制代碼的形式提供,而是以源代碼的形式提供。STL被組織為下面的13個頭文 件:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack> 和<utility>。

STL詳細的說六大組件:

  1. 容器:各種數(shù)據(jù)結(jié)構(gòu),如vector、list、deque、set、map等,用來存放數(shù)據(jù),從實現(xiàn)角度來看,STL容器是一種class template。
  2. 算法:各種常用的算法,如sort、find、copy、for_each。從實現(xiàn)的角度來看,STL算法是一種function tempalte.
  3. 迭代器:扮演了容器與算法之間的膠合劑,共有五種類型,從實現(xiàn)角度來看,迭代器是一種將operator* , operator-> , operator++,operator–等指針相關(guān)操作予以重載的class template. 所有STL容器都附帶有自己專屬的迭代器,只有容器的設(shè)計者才知道如何遍歷自己的元素。原生指針(native pointer)也是一種迭代器。
  4. 仿函數(shù):行為類似函數(shù),可作為算法的某種策略。從實現(xiàn)角度來看,仿函數(shù)是一種重載了operator()的class 或者class template
  5. 適配器:一種用來修飾容器或者仿函數(shù)或迭代器接口的東西。
  6. 空間配置器:負責空間的配置與管理。從實現(xiàn)角度看,配置器是一個實現(xiàn)了動態(tài)空間配置、空間管理、空間釋放的class tempalte.

STL六大組件的交互關(guān)系,容器通過空間配置器取得數(shù)據(jù)存儲空間,算法通過迭代器存儲容器中的內(nèi)容,仿函數(shù)可以協(xié)助算法完成不同的策略的變化,適配器可以修飾仿函數(shù)

二、STL優(yōu)點

1)STL是C++的一部分,因此不用額外安裝什么,它被內(nèi)建在你的編譯器之內(nèi)。

2)STL的一個重要特點是數(shù)據(jù)結(jié)構(gòu)和算法的分離。盡管這是個簡單的概念,但是這種分離確實使得STL變得非常通用。

例如,在STL的vector容器中,可以放入元素、基礎(chǔ)數(shù)據(jù)類型變量、元素的地址;

STL的sort()函數(shù)可以用來操作vector,list等容器。

3) 程序員可以不用思考STL具體的實現(xiàn)過程,只要能夠熟練使用STL就OK了。這樣他們就可以把精力放在程序開發(fā)的別的方面。

4) STL具有高可重用性,高性能,高移植性,跨平臺的優(yōu)點。

  • 高可重用性:STL中幾乎所有的代碼都采用了模板類和模版函數(shù)的方式實現(xiàn),這相比于傳統(tǒng)的由函數(shù)和類組成的庫來說提供了更好的代碼重用機會。關(guān)于模板的知識,已經(jīng)給大家介紹了。
  • 高性能:如map可以高效地從十萬條記錄里面查找出指定的記錄,因為map是采用紅黑樹的變體實現(xiàn)的。(紅黑樹是平橫二叉樹的一種)
  • 高移植性:如在項目A上用STL編寫的模塊,可以直接移植到項目B上。
  • 跨平臺:如用windows的Visual Studio編寫的代碼可以在Mac OS的XCode上直接編譯。

5) 程序員可以不用思考STL具體的實現(xiàn)過程,只要能夠熟練使用STL就OK了。這樣他們就可以把精力放在程序開發(fā)的別的方面。

6) 了解到STL的這些好處,我們知道STL無疑是最值得C++程序員驕傲的一部分。每一個C++程序員都應(yīng)該好好學習STL。只有能夠熟練使用STL的程序員,才是好的C++程序員。

7) 總之:招聘工作中,經(jīng)常遇到C++程序員對STL不是非常了解。大多是有一個大致的映像,而對于在什么情況下應(yīng)該使用哪個容器和算法都感到比較茫然。STL是C++程序員的一項不可或缺的基本技能,掌握它對提升C++編程大有裨益。

三、三大組件介紹

容器

幾乎可以說,任何特定的數(shù)據(jù)結(jié)構(gòu)都是為了實現(xiàn)某種特定的算法。STL容器就是將運用最廣泛的一些數(shù)據(jù)結(jié)構(gòu)實現(xiàn)出來。

常用的數(shù)據(jù)結(jié)構(gòu):數(shù)組(array) , 鏈表(list), tree(),(stack), 隊列(queue), 集合(set),映射表(map), 根據(jù)數(shù)據(jù)在容器中的排列特性,這些數(shù)據(jù)分為序列式容器和關(guān)聯(lián)式容器兩種。

  • 序列式容器(Sequence containers)

    每個元素都有固定位置--取決于插入時機和地點,和元素值無關(guān)。如:Vector容器、Deque容器、List容器等。

  • 關(guān)聯(lián)式容器(Associated containers)

    元素位置取決于特定的排序準則,和插入順序無關(guān)。關(guān)聯(lián)式容器是非線性的樹結(jié)構(gòu),更準確的說是二叉樹結(jié)構(gòu)。各元素之間沒有嚴格的物理上的順序關(guān)系,也就是說元素在容器中并沒有保存元素置入容器時的邏輯順序。關(guān)聯(lián)式容器另一個顯著特點是:在值中選擇一個值作為關(guān)鍵字key,這個關(guān)鍵字對值起到索引的作用,方便查找。Set/multiset容器 Map/multimap容器

數(shù)據(jù)結(jié)構(gòu) 描述 實現(xiàn)頭文件
向量(vector) 連續(xù)存儲的元素 <vector>
列表(list) 由節(jié)點組成的雙向鏈表,每個結(jié)點包含著一個元素 <list>
雙隊列(deque) 連續(xù)存儲的指向不同元素的指針所組成的數(shù)組 <deque>
集合(set) 由節(jié)點組成的紅黑樹,每個節(jié)點都包含著一個元素,節(jié)點之間以某種作用于元素對的謂詞排列,沒有兩個不同的元素能夠擁有相同的次序 <set>
多重集合(multiset) 允許存在兩個次序相等的元素的集合 <set>
棧(stack) 后進先出的值的排列 <stack>
隊列(queue) 先進先出的執(zhí)的排列 <queue>
優(yōu)先隊列(priority_queue) 元素的次序是由作用于所存儲的值對上的某種謂詞決定的的一種隊列 <queue>
映射(map) 由{鍵,值}對組成的集合,以某種作用于鍵對上的謂詞排列 <map>
多重映射(multimap) 允許鍵對有相等的次序的映射 <map>

迭代器

迭代器從作用上來說是最基本的部分,可是理解起來比前兩者都要費力一些。軟件設(shè)計有一個基本原則,所有的問題都可以通過引進一個間接層來簡化, 這種簡化在STL中就是用迭代器來完成的。概括來說,迭代器在STL中用來將算法和容器聯(lián)系起來,起著一種黏和劑的作用。幾乎STL提供的所有算法都是通 過迭代器存取元素序列進行工作的,每一個容器都定義了其本身所專有的迭代器,用以存取容器中的元素。

迭代器部分主要由頭文件<utility>,<iterator>和<memory>組 成。<utility>是一個很小的頭文件,它包括了貫穿使用在STL中的幾個模板的聲明,<iterator>中提供了迭代器 使用的許多方法,而對于<memory>的描述則十分的困難,它以不同尋常的方式為容器中的元素分配存儲空間,同時也為某些算法執(zhí)行期間產(chǎn)生 的臨時對象提供機制,<memory>中的主要部分是模板類allocator,它負責產(chǎn)生所有容器中的默認分配器。

迭代器的種類:

迭代器 功能 描述
輸入迭代器 提供對數(shù)據(jù)的只讀訪問 只讀,支持++、==、!=
輸出迭代器 提供對數(shù)據(jù)的只寫訪問 只寫,支持++
前向迭代器 提供讀寫操作,并能向前推進迭代器 讀寫,支持++、==、!=
雙向迭代器 提供讀寫操作,并能向前和向后操作 讀寫,支持++、–,
隨機訪問迭代器 提供讀寫操作,并能以跳躍的方式訪問容器的任意數(shù)據(jù),是功能最強的迭代器 讀寫,支持++、–、[n]、-n、<、<=、>、>=

算法

函數(shù)庫對數(shù)據(jù)類型的選擇對其可重用性起著至關(guān)重要的作用。舉例來說,一個求方根的函數(shù),在使用浮點數(shù)作為其參數(shù)類型的情況下的可重用性肯定比使 用整型作為它的參數(shù)類性要高。而C++通過模板的機制允許推遲對某些類型的選擇,直到真正想使用模板或者說對模板進行特化的時候,STL就利用了這一點提 供了相當多的有用算法。它是在一個有效的框架中完成這些算法的——可以將所有的類型劃分為少數(shù)的幾類,然后就可以在模版的參數(shù)中使用一種類型替換掉同一種 類中的其他類型。

STL提供了大約100個實現(xiàn)算法的模版函數(shù),比如算法for_each將為指定序列中的每一個元素調(diào)用指定的函數(shù),stable_sort以你所指定的規(guī)則對序列進行穩(wěn)定性排序等等。這樣一來,只要熟悉了STL之后,許多代碼可以被大大的化簡,只需要通過調(diào)用一兩個算法模板,就可以完成所需要 的功能并大大地提升效率。

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

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

//STL 中的容器 算法 迭代器
void test01(){
vector<int> v; //STL 中的標準容器之一 :動態(tài)數(shù)組
v.push_back(1); //vector 容器提供的插入數(shù)據(jù)的方法
v.push_back(5);
v.push_back(3);
v.push_back(7);
//迭代器
vector<int>::iterator pStart = v.begin(); //vector 容器提供了 begin()方法 返回指向第一個元素的迭代器
vector<int>::iterator pEnd = v.end(); //vector 容器提供了 end()方法 返回指向最后一個元素下一個位置的迭代器
//通過迭代器遍歷
while (pStart != pEnd){
cout << *pStart << " ";
pStart++;
}
cout << endl;
//算法 count 算法 用于統(tǒng)計元素的個數(shù)
int n = count(pStart, pEnd, 5);
cout << "n:" << n << endl;
}
//STL 容器不單單可以存儲基礎(chǔ)數(shù)據(jù)類型,也可以存儲類對象
class Teacher
{
public:
Teacher(int age) :age(age){};
~Teacher(){};
public:
int age;
};
void test02(){
vector<Teacher> v; //存儲 Teacher 類型數(shù)據(jù)的容器
Teacher t1(10), t2(20), t3(30);
v.push_back(t1);
v.push_back(t2);
v.push_back(t3);
vector<Teacher>::iterator pStart = v.begin();
vector<Teacher>::iterator pEnd = v.end();
//通過迭代器遍歷
while (pStart != pEnd){
cout << pStart->age << " ";
pStart++;
}
cout << endl;
}
//存儲 Teacher 類型指針
void test03(){
vector<Teacher*> v; //存儲 Teacher 類型指針
Teacher* t1 = new Teacher(10);
Teacher* t2 = new Teacher(20);
Teacher* t3 = new Teacher(30);
v.push_back(t1);
v.push_back(t2);
v.push_back(t3);
//拿到容器迭代器
vector<Teacher*>::iterator pStart = v.begin();
vector<Teacher*>::iterator pEnd = v.end();
//通過迭代器遍歷
while (pStart != pEnd){
cout << (*pStart)->age << " ";
pStart++;
}
cout << endl;
}
//容器嵌套容器 難點
void test04()
{
vector< vector<int> > v;
vector<int>v1;
vector<int>v2;
vector<int>v3;

for (int i = 0; i < 5;i++)
{
v1.push_back(i);
v2.push_back(i * 10);
v3.push_back(i * 100);
}
v.push_back(v1);
v.push_back(v2);
v.push_back(v3);

for (vector< vector<int> >::iterator it = v.begin(); it != v.end();it++)
{
for (vector<int>::iterator subIt = (*it).begin(); subIt != (*it).end(); subIt ++)
{
cout << *subIt << " ";
}
cout << endl;
}
} 
int main(){
//test01();
//test02();
//test03();
test04();
system("pause");
return 0;
}

部分內(nèi)容來自:

[【C/C++】STL詳解]:( https://blog.csdn.net/qq_42322103/article/details/99685797)

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多