1. 程式人生 > >【通俗易懂-C++ STL模板庫】STL實用技術專題

【通俗易懂-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)、

空間配製器( allocator)。

使用 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非常重要要。

每天進步一點點,如果覺得有用,想了解更多請關注微信公眾號

 如果覺得有用點個贊支援一下!