C++之STL理論基礎

1.基本概念

STL(Standard Template Library,標準模板庫)是惠普實驗室開發的一系列軟件的統稱。雖然主要出現在C++中,但在被引入C++之前該技術就已經存在了很長的一段時間。
STL的從廣義上講分為三部分:algorithm(算法)、container(容器)和iterator(迭代器),容器和算法通過迭代器可以進行無縫地連接。幾乎所有的代碼都采 用了模板類和模板函數的方式,這相比于傳統的由函數和類組成的庫來說提供了更好的代碼重用機會。在C++標準中,STL被組織為下面的13個頭文件:
<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack> 和<utility>
此外,C++的STL還包括仿函數、適配器以及空間適配器。

2.STL的優勢

  1. STL是C++的一部分,因此不用額外安裝什么,它被內建在你的編譯器之內。
  2. STL的一個重要特點是數據結構和算法的分離。盡管這是個簡單的概念,但是這種分離確實使得STL變得非常通用。例如,在STL的vector容器中,可以放入元素(對象)、基礎數據類型變量、指針;STL的sort()函數可以用來操作vector,list等容器。
  3. 程序員可以不用思考STL具體的實現過程,只要能夠熟練使用STL就OK了。這樣他們就可以把精力放在程序開發的別的方面。
  4. STL具有高可重用性,高性能,高移植性,跨平臺的優點。
  5. STL有以下這些好處,我們知道STL無疑是最值得C++程序員驕傲的一部分。每一個C++程序員都應該好好學習STL。只有能夠熟練使用STL的程序員,才是好的C++程序員。

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

3.容器

  在實際的開發過程中,數據結構本身的重要性不會遜于操作于數據結構的算法的重要性,當程序中存在著對時間要求很高的部分時,數據結構的選擇就顯得更加重要。
  經典的數據結構數量有限,但是我們常常重復著一些為了實現向量、鏈表等結構而編寫的代碼,這些代碼都十分相似,只是為了適應不同數據的變化而在細節上有所出入。STL容器就為我們提供了這樣的方便,它允許我們重復利用已有的代碼實現構造自己的特定類型下的數據結構,通過設置一些模板,STL容器對最常用的數據結構提供了支持,這些模板的參數允許我們指定容器中元素的數據類型,可以將我們許多重復而乏味的工作簡化。
  在C++ 中容器被定義為:在數據存儲上,有一種對象類型,它可以持有其它對象或指向其它對象的指針,這種對象類型就叫做容器。

容器部分主要由頭文件<vector>,<list>,<deque>,<set>,<map>,<stack> 和<queue> 組成

容器的分類:

標準C++的STL框架中的容器主要有兩大類:

序列式容器(Sequence containers): 將一組具有相同類型T的對象,以嚴格的線性形式組織在一起。
每個元素都有固定位置--取決于插入時機和地點,和元素值無關。如:

vector(向量)、deque(double-ended queue雙端隊列)、list(表)

序列容器可以視為數組和鏈表的推廣。

關聯式容器(Associated containers): 關聯容器的特點是(鍵)有序的,即元素是按預定義的鍵順序(如升序)插入的。
元素位置取決于特定的排序準則,和插入順序無關 :

set<Key>(集合)multiset<Key>(多重集合)map<Key, T>(映射/映像)multimap<Key, T>(多重映射)hash_set<Key, H>(散列集)hash_map<Key, T, H>(散列映射)hash_multimap<Key, T, H>(散列多映射)

容器適配器(container adapter)不是獨立的容器,只是某種容器的變種,它提供原容器的一個專用的受限接口。特別是,容器適配器不提供迭代器。

stack<T>(棧)queue<T>(隊列)priority_queue<T>(優先隊列)

這里寫圖片描述

4.迭代器

  軟件設計有一個基本原則,所有的問題都可以通過引進一個間接層來簡化,這種簡化在STL中就是用迭代器來完成的。概括來說,迭代器在STL中用來將算法和容器聯系起來,起著一種黏和劑的作用。幾乎STL提供的所有算法都是通過迭代器存取元素序列進行工作的,每一個容器都定義了其本身所專有的迭代器,用以存取容器中的元素。
  迭代器部分主要由頭文件<utility>,<iterator>和<memory>組成。<utility>是一個很小的頭文件,它包括了貫穿使用在STL中的幾個模板的聲明,<iterator>中提供了迭代器使用的許多方法,而對于<memory>的描述則十分的困難,它以不同尋常的方式為容器中的元素分配存儲空間,同時也為某些算法執行期間產生 的臨時對象提供機制,<memory>中的主要部分是模板類allocator,它負責產生所有容器中的默認分配器。
  簡單來說,迭代器就是一個指針,指向具體容器中的具體元素,解引用以后的數據類型就是容器元素的數據類型。是容器和算法的粘合劑,是一個間接層。

5.算法

  函數庫對數據類型的選擇對其可重用性起著至關重要的作用。舉例來說,一個求方根的函數,在使用浮點數作為其參數類型的情況下的可重用性肯定比使用整型作為它的參數類性要高。而C++通過模板的機制允許推遲對某些類型的選擇,直到真正想使用模板或者說對模板進行特化的時候,STL就利用了這一點提 供了相當多的有用算法。它是在一個有效的框架中完成這些算法的——可以將所有的類型劃分為少數的幾類,然后就可以在模版的參數中使用一種類型替換掉同一種類中的其他類型。
  STL提供了大約100個實現算法的模版函數,比如算法for_each將為指定序列中的每一個元素調用指定的函數,stable_sort以 你所指定的規則對序列進行穩定性排序等等。這樣一來,只要熟悉了STL之后,許多代碼可以被大大的化簡,只需要通過調用一兩個算法模板,就可以完成所需要 的功能并大大地提升效率。
  算法部分主要由頭文件,和組 成。是所有STL頭文件中最大的一個(盡管它很好理解),它是由一大堆模版函數組成的,可以認為每個函數在很大程度上都是獨立的,其中常用到的功能范圍涉及到比較、交換、查找、遍歷操作、復制、修改、移除、反轉、排序、合并等等。體積很小,只包括幾個在序列上面進行簡單數學運算的模板函數,包括加法和乘法在序列上的一些操作。中則定義了一些模板類,用以聲明函數對象。

說白了就是一系列的函數集合,這些函數通常是模板函數。

代碼示例

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;void func1()
{// 定義一個容器:用來存數據、存 int 數據vector<int> a;a.push_back(1);a.push_back(2);a.push_back(1);a.push_back(3);a.push_back(1);a.push_back(4);a.push_back(1);a.push_back(5);// 迭代器,提供了遍歷容器的統一方法//vector<int>::iterator it;//for (it = a.begin(); it != a.end(); it++)//{//  cout << *it << " ";//}//cout << endl;vector<int>::iterator it = a.begin();while (it != a.end()){cout << *it << " ";it++;}cout << endl;// 算法:用來處理容器中的數據,通過迭代器int num = count(a.begin(), a.end(), 1);cout << num << endl;
}class Student 
{
public:Student (int id, int age){this->id = id;this->age = age;}void print(){printf ("id = %d, age = %d\n", id, age);}
private:int id;int age;
};void func2()
{Student s1(10,20);Student s2(11,21);Student s3(12,22);Student s4(13,23);Student s5(14,24);vector<Student> v;v.push_back(s1);v.push_back(s2);v.push_back(s3);v.push_back(s4);v.push_back(s5);vector<Student>::iterator it = v.begin();while (it != v.end()){it->print();it++;}
}void func3()
{Student s1(10,20);Student s2(11,21);Student s3(12,22);Student s4(13,23);Student s5(14,24);vector<Student*> v;
//  v.push_back(&s1);
//  v.push_back(&s2);
//  v.push_back(&s3);
//  v.push_back(&s4);
//  v.push_back(&s5);v.push_back(new Student(10,20));v.push_back(new Student(11,21));v.push_back(new Student(12,22));v.push_back(new Student(13,23));v.push_back(new Student(14,24));vector<Student*>::iterator it = v.begin();while (it != v.end()){(*it)->print();it++;}
}int main()
{// func1();// func2();func3();return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/448351.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/448351.shtml
英文地址,請注明出處:http://en.pswp.cn/news/448351.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

方向盤

定義 方向盤是汽車、輪船、飛機等的操縱行駛方向的輪狀裝置。 構成 一般由骨架和發泡組合起來就是最簡單的方向盤了&#xff0c;而方向盤上都會有和主駕駛氣囊對應的安裝卡扣或螺釘孔&#xff0c;其下方一般會有多功能開關模塊。作用 方向盤不僅可以控制車輛的方向…

數據庫范式俗話

1NF&#xff1a;一個table中的列是不可再分的&#xff08;即列的原子性&#xff09; 2NF&#xff1a;一個table中的行是可以唯一標示的&#xff0c;&#xff08;即table中的行是不可以 重復的&#xff09; 3NF&#xff1a;一個table中的列不依賴于另一個table中的非主鍵列 4NF&…

STL之string類型

1.String概念 string是STL的字符串類型&#xff0c;通常用來表示字符串。而在使用string之前&#xff0c;字符串通常是用char*表示的。 string和char*的區別&#xff1a; string是一個類, char*是一個指向字符的指針。 string封裝了char*&#xff0c;管理這個字符串&#x…

解決maven打包報錯:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 一、報錯經歷&#xff1a; 今天使用eclipse通過maven install打war包的時候&#xff0c;出現了下圖所示的錯誤 二、問題分析&#xff1a…

離合器

離合器的定義 汽車離合器位于發動機和變速箱之間的飛輪殼內&#xff0c;用螺釘將離合器總成固定在飛輪的后平面上&#xff0c;離合器的輸出軸就是變速箱的輸入軸。在汽車行駛過程中&#xff0c;駕駛員可根據需要踩下或松開離合器踏板&#xff0c;使發動機與變速箱暫時分離和…

Python 刪除滿足條件的某些行

數據&#xff1a; data 字段&#xff1a;col 要刪除的內容是 col False 的行 # 方案一 data1 data[~data[col] False] # ~ 取反# 方案二 保留 data[已采] ! False ind data[col] ! False data2 data.loc[ind,]# 方案三 去掉 data[已采] True ind2 data[col] False…

STL之Vector

1.簡介 vector是將元素置于一個動態數組中加以管理的容器。可以隨機存取元素&#xff08;支持索引值直接存取&#xff0c;用[]操作符或at()方法&#xff0c;還支持迭代器方式存取&#xff09;。   vector尾部添加或移除元素非常快速。但是在中部或頭部插入元素或移除元素比…

解決 : Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 執行 maven install 命令報錯如題&#xff1a; Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:comp…

制動踏板

什么是制動踏板 制動踏板就是限制動力的踏板&#xff0c;即腳剎(行車制動器)的踏板&#xff0c;是長時間摩擦導致剎車片過熱軟化的原因。制動踏板的作用 其主要作用是剎車減速或停車。 制動踏板的工作原理 在機器的高速軸上固定一個輪或盤&#xff0c;在機座上安裝…

實現一個用戶取過的數據不被其他用戶取到

實現一個用戶取過的數據不被其他用戶取到: 問題&#xff1a; 在用ADO訪問數據庫時&#xff0c;從一個表中取一定的記錄&#xff08;比如20行&#xff09;&#xff0c;取出后在程序中使用&#xff0c;使用完后刪除掉記錄&#xff08;不用更新或刪除記錄&#xff09;。在多用戶操…

Docker 鏡像 重命名

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 鏡像改名命令格式&#xff1a; # 命令格式&#xff1a;docker tag 鏡像id 倉庫&#xff1a;標簽或&#xff1a;docker tag 舊鏡…

STL之deque和其他容器

deque簡介 deque是“double-ended queue”的縮寫&#xff0c;和vector一樣都是STL的容器&#xff0c;deque是雙端數組&#xff0c;而vector是單端的。 deque在接口上和vector非常相似&#xff0c;在許多操作的地方可以直接替換。 deque可以隨機存取元素&#xff08;支持索引…

Java藍橋杯02——第二題集錦:生日蠟燭、星期一、方格計數、猴子分香蕉

第二題 生日蠟燭(結果填空) 某君從某年開始每年都舉辦一次生日party&#xff0c;并且每次都要吹熄與年齡相同根數的蠟燭。 現在算起來&#xff0c;他一共吹熄了236根蠟燭。 請問&#xff0c;他從多少歲開始過生日party的&#xff1f; 請填寫他開始過生日party的年齡數。 注意&a…

夜考

夜考內容 夜考主要考察夜間汽車燈的使用。上車前準備 1、向考官報告 2、繞車一周觀察車輛狀況 3、觀察車前道路上是否有障礙 4、觀察后方是否有來車 注意事項 1、發動車輛時&#xff0c;記得打開車燈; 2、會車時&#xff0c;距來車150米左右&#xff0c;使用近光燈;…

解決:Error response from daemon: Get https://index.docker.io/v1/search?q=openjdkn=25: dial tcp: looku

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 我只是想查一個 mysql 鏡像。執行命令&#xff1a; docker search mysql 。報錯如下&#xff1a; Error response from daemon…

STL之set

set簡介 set是一個集合容器&#xff0c;其中所包含的元素是唯一的&#xff0c;集合中的元素按一定的順序排列。元素插入過程是按排序規則插入&#xff0c;所以不能指定插入位置。 set采用紅黑樹變體的數據結構實現&#xff0c;紅黑樹屬于平衡二叉樹。在插入操作和刪除操作上比…

大三了,計算機專業學生的困惑。 [轉]

我現在已經大三了覺得進大學里職業或是學習必須要有一個很好的規劃要不然真的會浪費很多時間在一些無謂的事情上自己需要有個明確的目標&#xff0c;否則真的會錯失方向我知道不要太浮躁&#xff0c;很容易被一些表面上的東西誘惑。有師長建議時說&#xff1a;我今年畢業&#…

夜間行駛

夜間行駛的特點 特點是視線差&#xff0c;而且駕駛者容易被對面來車大燈晃的眩目&#xff0c;眼前一片漆黑&#xff0c;而造成操作失當。注意事項 1、會車時應注意減速&#xff0c;觀察前方與兩側情況&#xff0c;關閉遠光燈; 2、進出主路先看車燈; 3、掌握安全車速&…

解決: /bin/sh: 1: java: not found

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 情況描述&#xff1a; 我自己寫 dockerfile , buid 了一個鏡像&#xff0c;接下來就想后臺方式 run 一個容器&#xff0c; docke…

STL之map和multimap容器

1.簡介 map是標準的關聯式容器&#xff0c;一個map是一個鍵值對序列&#xff0c;即(key,value)對。它提供基于key的快速檢索能力。map中key值是唯一的。集合中的元素按一定的順序排列。元素插入過程是按排序規則插入&#xff0c;所以不能指定插入位置。map的具體實現采用紅黑樹…