C STL學習筆記 1

2021-05-17 11:46:29 字數 3709 閱讀 6404

本文面向的讀者:學習過c++程式語言(也就是說學習過template),但是還沒有接觸過stl的stl的初學者。這實際上是學習stl的一篇筆記。

什麼是泛型程式設計

我們可以簡單的理解為:使用模板的程式設計就是泛型程式設計。就像我們我們可以簡單的理解物件導向程式設計就是使用虛函式的程式設計一樣。

stl是什麼

作為乙個c++程式設計者,stl是一種不可忽視的技術。sandard template library (stl):

標準模板庫,更準確的說是 c++ 程式語言標準模板庫。學習過mfc的人知道,mfc是微軟公司建立的 c++ 類庫。而與之類似的是 stl 是模板庫,只不過 stl 是 ansi/iso 標準的一部分,而 mfc 只不過是微軟的乙個產品而已。也就是說stl是所有c++編譯器和所有作業系統平台都支援的一種庫,說它是一種庫是因為,雖然stl是一種標準,也就是說對所有的編譯器來說,提供給c++程式設計者的介面都是一樣的。也就是說同一段stl**在不同編譯器和作業系統平台上執行的結果都是相同的,但是底層實現可以是不同的。 令人興奮的是,stl的使用者並不需要了解它的底層實現。 試想一下,如果我們有一把能開啟所有鎖的鑰匙,那將是多麼令人瘋狂啊。嘎嘎。這個歪夢我做了20多年鳥。

stl的目的是標準化元件,這樣你就不用重新開發它們了。你可以僅僅使用這些現成的元件。stl現在是c++的一部分,因此不用額外安裝什麼。它被內建在你的編譯器之內。

為什麼我們需要學習stl

雖然,stl的優點甚多,但是stl的語法實在令初學者人頭疼,許多人望而卻步。可是stl是每個c++程式設計者遲早都要啃的一塊骨頭。因為越來越多的c++**是用stl編寫的,看不懂麻煩就大鳥。越來越多的人在用stl,不懂就無法和別人一起合作了。好事多磨嘛,早點學習早點解脫。

下面讓我們來看幾段**吧:(你覺得頭疼就不要看了)

//stl_cpp_1.cpp

#include double mean(double *array, size_t n)

std::vector::iterator it = v.begin() + 1;

it = v.insert(it, 33);

v.insert(it, q.begin(), q.end());

it = v.begin() + 3;

v.insert(it, 3, -1);

it = v.begin() + 4;

v.erase(it);

it = v.begin() + 1;

v.erase(it, it + 4);

v.clear();

return 0;

}

這一段你又看到了新東西了吧,iterator???不羅嗦了,等你看完這篇文章,回頭再看就簡單了。在正式介紹stl之前,我們需要花點時間來了解一下模板和命名空間。

關於模板的其他細節,讀者可以參閱《c++ templates 中文版》(有點費腦子哦)。在這裡,我只簡單的介紹一下模板類和函式模板的概念。

模板是c++中實現**重用機制的一種工具,可以實現型別引數化,把型別定義為引數。函式模板和類模板允許使用者構造模板函式和模板類。

圖1下面我們來看一段函式模板的例子:

//stl_cpp_4.cpp

#include#include//定義函式模板

template//template 是關鍵字,t 表示一種待例項化的型別

//template也是對的

t max(t a, t b)//函式模板,函式名為 max,此函式有2個t型別的引數,返回型別為t

//在此例例項化的時候,t可以是多種型別的,int,char,string…

int main(void)

void set_value(t v)

t get_value(void)

};//main()函式中測試ex_class類模板

int main(void)

{ //測試int型別資料

ex_class a(5),b(10);

cout<<"a.value:"cout<<"ch.value:"cout<<"x.value:"<命名空間(名字空間)

命名空間是c++的一種機制,用來把單個識別符號下的大量有邏輯聯絡的程式實體組合到一起。此識別符號作為此組群的名字。命名空間用關鍵字namespace 來定義:

//stl_cpp_6.cpp

#include using namespace std;

namespace printa

{ print() {cout<<"using namespace printa….."《乙個namespace是指乙個具名的範圍(named scope)。namespace被用來將相關的宣告劃歸在一起,將不相關的**部分隔開。命名空間只是命名了乙個特殊的作用域,當程式很大,而且需要多人合作的時候,命名空間就顯得特別的重要。比如2個程式設計師a,b 在同乙個程式中定義了函式 pop(),如果沒有使用命名空間,則會出錯,而且這種錯誤難以檢測出來。為了安全起見,他們可以定義不同的命名空間 a和b,在用的時候可以使用a::pop()和b::pop()來區分。

在stl中,標準庫的全部成員在預先定義的命名空間std中。如果要用類模板vector ,有兩種方法:一是在程式的前面新增預處理指令:

#include using namespace std;

第二種方法是:

#include using std::vector;
動態繫結和靜態繫結

所謂繫結是指,對於參與多型行為的型別,他們具有多型行為的介面是在公共基類的設計中就預先確定的。而非繫結則對於參與多型行為的型別,他們的介面沒有預先定義。

在c++中通過繼承實現的多型是動態繫結,通過模板實現的多型是靜態繫結。動態繫結的介面是在執行期間(動態)完成的,靜態繫結的介面是在編譯期間(靜態)完成的。好了,有了以上的知識我們可以來學習stl 了。

stl 的組成

stl有三大核心部分:容器(container)、演算法(algorithms)、迭代器(iterator),容器介面卡(container adaptor),函式物件(functor),除此之外還有stl其他標準元件。

對儲存於容器中的資料進行處理時,迭代器能從乙個成員移向另乙個成員。他能按預先定義的順序在某些容器中的成員間移動。對普通的一維陣列、向量、雙端佇列和列表來說,迭代器是一種指標。

知道了吧?嘎嘎,當然了,你猜到了,那是我在瞎扯蛋。

下面讓我們來看看專家是怎麼說的:

下面我將依次介紹stl的這三個主要元件。

容器

stl中的容器有佇列容器和關聯容器,容器介面卡(congtainer adapters:stack,queue,priority queue),位集(bit_set),串包(string_package)等等。

在本文中,我將介紹list,vector,deque等佇列容器,和set和multisets,map和multimaps等關聯容器,一共7種基本容器類。

佇列容器(順序容器):佇列容器按照線性排列來儲存t型別值的集合,佇列的每個成員都有自己的特有的位置。順序容器有向量型別、雙端佇列型別、列表型別三種。

基本容器——順序容器

向量(vector容器類):#include ,vector是一種動態陣列,是基本陣列的類模板。其內部定義了很多基本操作。既然這是乙個類,那麼它就會有自己的建構函式。vector 類中定義了4中種建構函式:

C STL 學習筆記

一 stl a include include using namespace std 1 void sort iterator start,iterator end void sort iterator start,iterator end,strictweakordering cmp cmp 函...

C STL學習筆記

remove if使用方法 int a vectorarr a,a 14 std remove if arr.begin arr.end std bind2nd std less 100 for int i 0 i arr.size i 輸出結果為 240 100200 300102 555100 ...

C STL學習筆記

stl是個寶 由於c stl的開放,代替了那些需要老老實實寫結構體來實現堆疊二叉樹等資料結構的c等語言,很多演算法不需要自己來實現了 所有容器都有的兩個時間複雜度為o 1 的方法 a.size 返回容器中元素的個數 a.empty 返回容器是否為空 vector也叫變長陣列,即陣列長度可以動態變化。...