【通俗易懂-C++ STL模板庫】STL實用技術專題
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> 。
STL詳細的說六大元件 :
容器( Container)、演算法( Algorithm )、迭代器( Iterator ) 、仿函式( Function object )、 介面卡( Adaptor)、
使用 STL的好處
(1)STL是 C++的一部分,因此不用額外安裝什麼,它被內建在你的編譯器之內。
( 2)STL的一個重要特點是資料結構和演算法的分離 。儘管這是個簡單的概念, 但是這種分離確實使得 STL 變得非常通用。 例如,在 STL的 vector 容器中,可以放入元素、基礎資料型別變數、元素的地址;STL的 sort()函式可以用來操作 vector,list 等容器。
(3) 程式設計師可以不用思考 STL具體的實現過程,只要能夠熟練使用 STL就 OK 了。這樣他們就可以把 精力放在程式開發的別的方面。
( 4) STL具有高可重用性,高效能,高移植性,跨平臺的優點。
高可重用性: STL 中幾乎所有的程式碼都採用了模板類和模版函式的方式實現,這相 比於傳統的由函式和類組成的庫來說提供了更好的程式碼重用機會。
高效能:如 map 可以高效地從十萬條記錄裡面查找出指定的記錄,因為 map 是採 用紅黑樹的變體實現的。 (紅黑樹是平橫二叉樹的一種 )
高移植性:如在專案 A 上用 STL編寫的模組,可以直接移植到專案 B上。 跨平臺:如用 windows 的 Visual Studio 編寫的程式碼可以在 Mac OS的 XCode上直接 編譯。
(5) 程式設計師可以不用思考 STL具體的實現過程,只要能夠熟練使用 STL就 OK 了。這樣 他們就可以把精力放在程式開發的別的方面。
( 6) 瞭解到 STL的這些好處,我們知道 STL無疑是最值得 C++程式設計師驕傲的一部分。每 一個 C++程式設計師都應該好好學習 STL。只有能夠熟練使用 STL的程式設計師, 才是好的 C++程式設計師。
( 7) 總之:經常遇到 C++程式設計師對 STL不是非常瞭解。大多是有一個大致的映像,而對 於在什麼情況下應該使用哪個容器和演算法都感到比較茫然。 STL是 C++程式設計師的一項不可或缺的 基本技能 ,掌握它對提升 C++程式設計大有裨益。
如果問學習C++ STL需要學習那些內容,我個人覺得以下內容是值得掌握的,因為在專案中經常用到,所以今天跟大家分享一下。
STL概論
六大元件: 容器、演算法、迭代器、仿函式、介面卡(配接器)、空間配置器
容器 Container
序列式容器
關聯式容器 有個key起到索引作用
演算法 algorithm
質變演算法
非質變演算法
迭代器 iterator
雙向
隨機訪問 (功能最強 ,可以支援跳躍式的訪問)
優點
不需要安裝東西,直接使用
高複用性、高移植、高效能
資料和演算法分離,利用迭代器進行溝通
程式設計師可以不用思考 STL 具體的實現過程,只要能夠熟練使用 STL 就 OK 了。這樣他們就可以把精力放在程式開發的別的方面
容器演算法迭代器初識
vector<型別> v 容器
插 v.push_back()
起始迭代器 v.begin() 指向容器中第一個元素
結束迭代器 v.end() 指向容器中最後一個元素下一個位置
for_each遍歷 引入標頭檔案 algorithm
string容器
構造、賦值
字元存取 [] at 區別
at 訪問越界 丟擲 out_of_range異常
[] 直接掛掉
拼接、查詢、替換
+= append 拼接
查詢 find 查不到 返回 -1 rfind 從右往左查
替換 replace
比較 compare
專案 = 1 字串1 大 > 0 字串1 小 <0
子串
string substr(int pos = 0, intn = npos) const;//返回由pos開始的n個字元組成的字串
插入 insert
刪除 erase
char * 和 string 轉換
char * 轉string 呼叫string有參構造 string str( “char *”)
string 轉 char* .c_str() const char *
編譯器可以將 char * 隱式型別轉換為string,反之不可以
小
寫轉大寫 和 大寫轉小寫
轉大寫 toupper
轉小寫 tolower
vector容器
與陣列型別,但是是動態陣列
動態分配記憶體並不是原有空間下分配,而是找一個新空間,將原有資料拷貝到新空間下,然後釋放掉原有空間
構造、賦值
交換 swap
size 容器的大小
capacity 容器的容量
empty 容器是否為空
resize 重新指定容器長度
如果比原來長了,預設用0填充,可以用第二個引數代替預設值
如果比原來短了,超出的部分元素就被刪除掉了
reserve 預留空間,但是不初始化
at、[] 對元素存取,at越界丟擲異常 ,[]直接掛掉
第一個元素 front
最後一個元素 back
插入 insert(迭代器)
刪除 erase(迭代器 )
清空 clear
尾插 push_back
尾刪 pop_back
巧用swap來收縮記憶體
巧用reserve預留空間
逆序遍歷 迭代器 reverse_iterator
如果判斷一個容器的迭代器是否支援隨機訪問
deque容器
雙端陣列 沒有容量 內部用中控器控制連續分段空間
可以對頭部進行插入刪除
和vector的測試介面差不多
不同 頭部插入push_front 頭部 刪除 pop_front
我個人覺得 多態 是C++的精華,STL是C++的高階。如果沒有學習STL相當於只掌握C++的一半內容。
所以個人覺得如果走C++方向,STL非常重要要。
每天進步一點點,如果覺得有用,想了解更多請關注微信公眾號
如果覺得有用點個贊支援一下!