本節主要講述 STL 歷史、STL 組件、STL 基本結構以及 STL 編程概述。
STL 歷史可以追溯到 1972 年 C 語言在 UNIX 計算機上的首次使用。直到 1994 年,STL 才被正式納入 C++ 標準中。
STL 組件主要包括容器,迭代器、算法和仿函數。STL 基本結構和 STL 組件對應。
STL 主要由迭代器、算法、容器、仿函數、內存配置器和配接器六部分組成,可幫助程序員完成許多功能完善、形式多樣的程序。
STL歷史C 語言是 1972 年由美國的 設計發明的,并首次在 UNIX 操作系統的計算機上使用。C 語言由早期的匯編語言 BCPL 發展演變而來。隨著微型計算機的日益普及,C 語言出現了許多其他版本c語言小型投票系統,由于沒有統一的標準,各版本之間出現了不一致之處。ANSI 因此為 C 語言制定一套 ANSI 標準,后來成為現行的 C 語言標準。
早期的 C 語言主要用于 UNIX 系統。因其強大的功能和各方面的優點逐漸被人們認識。20 世紀 80 年代,C 語言開始應用于其他操作系統,并很快在各種計算機上得到廣泛應用,成為當代最優秀的程序設計語言之一。
C 語言的表現能力和處理能力極強。它不僅具有豐富的運算符和數據類型,便于實現各類復雜的數據結構,還可以直接訪問內存物理地址,甚至進行位操作。此外,C 語言還可實現對硬件的編程操作,十分便捷方便。
1983 年,貝爾實驗室的 -strup 推出了 C++。C++ 進一步擴充和完善了 C 語言,成為面向對象的程序設計語言。最初 C++ 主要用于小型計算機系統。1988 年,出現了第一個用于 PC 的 C++ 2.0 編譯系統;1989 年,出現了 Turbo C++2.0 編譯器。
從 1991 年開始, 公司陸續推出了 C++ 2.0/3.0/4.0 系統。而微軟公司直到 1992 年,才推出基于 DOS 的 MS C/C++ 7.0 系統。
1993 年,微軟推出了面向 的 C++ 1. 0 系統,并于 1998 年推出 了 C++6. 0。
C 語言提供了具有可適應性的、強大的抽象機制,用于對問題進行抽象。這種語言結構允許程序員創建和使用新的類型,而這些新的類型則可以與實際應用中所包含的概念相適應。在 C++ 的最新發展過程中,C++ 新增了模板新特性。通過使用模板,程序具備更好的代碼重用性能。
1994 年 7 月,美國國家標準與技術研究院通過投票決定,將 STL 納入 C++ 標準,使之成為 C++ 庫的重要組成部分。1997 年,C++ 標準完成了最近一次的修改,官方名稱為 ISO/IEC 14882。
STL 從根本上講是“容器”的集合,也是組件的集合。容器包括 list、、set、map 等;組件包括迭代器等。STL 的目的是標準化組件,與 C++ 中的 ATL 相似。
STL 是 C++ 的一部分,不用額外安裝,被內建在支持 C++ 的編譯器中。
STL 的算法是標準算法,其實現了將已經定義好的算法應用在容器的對象上。
STL 組件STL 是 C++ 標準程序庫的核心。STL 內的所有組件都由模板構成,其元素可以是任意型別。程序員通過選用恰當的群集類別調用其成員函數和算法中的數據即可,但代價是 STL 晦澀難懂。
STL 組件主要包括容器,迭代器、算法和仿函數。
容器容器即用來存儲并管理某類對象的集合。例如魚缸是用來盛放金魚的容器。
每一種容器都有其優點和缺點。為滿足程序的各種需求,STL 準備了多種容器類型,容器可以是 或是 lists,或者每個元素有特別的鍵值。
迭代器迭代器用于在一個對象群集的元素上進行遍歷動作。對象群集可能是容器,也可能是容器的一部分。
迭代器的主要用途是為容器提供一組很小的公共接口。利用這個接口,某項操作可以行進至群集內的下一個元素。
每種容器都提供了各自的迭代器。迭代器了解該容器的內部結構,所以能夠正確行進。迭代器的接口和一般指針類似。
算法算法用來處理群集內的元素,可以出于不同目的搜尋、排序、修改、使用那些元素。所有容器的迭代器都提供一致的接口,通過迭代器的協助,算法程序可以用于任意容器。
STL 的一個特性是將數據和操作分離。數據由容器類別加以管理,操作則由可定制的算法定義。迭代器在兩者之間充當“粘合劑”,以使算法可以和容器交互運作。
STL 的另一個特性即組件可以針對任意型別運作。“標準模板庫”這一名稱即表示“可接受任意型別”的模板,并且這些型別均可執行必要操作。
在 STL 中,容器又分為序列式容器和關聯式容器兩大類,而迭代器的功能主要是遍歷容器內全部或部分元素的對象。迭代器可劃分為 5 種類屬,這 5 種類屬歸屬兩種類型:雙向迭代器和隨機存取迭代器。
SIL 中提供的算法包括搜尋、排序、復制、重新排序、修改、數值運算等。
仿函數STL中大量運用了仿函數。仿函數具有泛型編程強大的威力,是純粹抽象概念的例證。
STL基本結構STL 是 C++ 通用庫,由迭代器、算法、容器、仿函數、配接器和配置器(即內存配置器)組成。
容器STL 包含諸多容器類。容器類是可以包含其他對象的類,就像數組和隊列堆棧等數據結構包含整數、小數、類等數據成員一樣。STL 可以包含常見的向量類、鏈表類、雙向隊列類、集合類、圖類等,每個類都是一種模板,這些模板可以包含各種類型的對象。
下述代碼是常用的 賦值方法:
vectorl; for (int i =0;i <100;i++ ) l.push_back (i);
下述代碼采用 map 容器進行二維元素的管理:
map> cap; //按從小到大序 cap ["Ark"] ="Little Rock"; cap ["New"] ="Albany";
map 類似于二維數組,但比二維數組靈活得多。
目前,STL 中已經提供的容器主要如下:
以上容器設計高效,還提供了接口。程序員可以在任何適當的地方使用它們。
容器可以分為序列式容器和關聯式容器兩大類。序列式容器主要有 、list 和 deque;關聯式容器包括 set、map、 和 等容器模板類。
算法STL 提供了非常多的數據結構算法。這些算法在命名空間 std 的范圍內定義,通過包含頭文件 來獲得使用權。
常見的部分算法如下:
STL 中的所有算法都是基于模板實現的。
迭代器通俗來講,迭代器就是指示器。迭代器技術能夠使程序非常快捷地實現對 STL 容器中內容的反復訪問。反復訪問意味著一次可以訪問一個或多個元素。
迭代器為訪問容器提供了通用的方法,類似于 C++ 的指針。當參數化類型是 C++ 內部類型時,迭代器即 C++ 指針。
STL 定義了 5 種類型的指示器,并根據其使用方法予以命名。每種容器都支持某種類別的迭代器。常見的迭代器包括輸入、輸出、前向、雙向和隨機接入等類別:
迭代器的誕生使算法和容器分離成為可能。算法是模板,其類型依賴于迭代器,不會局限于單一容器。不同的 STL 算法需要不同類型的迭代器來實現相應的功能。因為不同類型的 STL 容器支持不同類型的迭代器,所以不能對所有容器使用相同的算法。
仿函數STL 包含了大量仿函數。仿函數可以理解為函數的一般形式。對于編程來說,仿函數非常重要,并有幾種約束。在 C++ 標準中,函數調用一般使用指針,當需要調用函數時,只需要提供函數的地址即可。例如:
static int cmp (int* i,int* j) {return (*i - *j); }
上述代碼定義了一個 cmp() 函數c語言小型投票系統,當需要調用此函數時,只需提供函數的地址即可。例如:
qsort(a,10,(int),cmp);
此方法的最大缺陷是效率低。為提高效率,STL 定義了仿函數這種概念。下述代碼定義了一個仿函數,其特征是使用 實現定義。
struct three_mul { bool operator() (int& v) { return (v%3 ==0) } }
通過運算符定義顯著提高效率。例如,
(.begin (),.end(),);
內存配置器和配接器STL 包括底層的內存分配和釋放。內存配置器非常少見,在此可以忽略,在后面章節專門介紹。
配接器可以實現不同類之間的數據轉換。最常用的配接器有 ,它提供了函數復制的接口。配接器對于 STL 技術來說非常重要。
STL 提供了 3 種容器配接器,分別是:
stack; queue ; deque ;
看這樣一個程序:
#include#include using namespace std; int main () { stack
st; //定義堆棧對象 for (int i = 0;i <10;i ++ ) st.push (i); //將數據壓入堆錢 while (!st.empty()) { cout << st.top() << " "; //彈出堆找的第一個元素,并輸出 st.pop(); //彈出堆棧元素 } cout<< endl; cin.get(); //任意鍵退出 return 0; }
程序執行結果為:
9 8 7 6 5 4 3 2 1 0
STL 使用方法STL 作為 C++ 通用庫,主要由迭代器、算法、容器、仿函數、內存配置器和配接器等六大部分組成。程序員使用 STL 容器能夠實現多種標準類型且操作便捷的容器。
對于編程人員,標準化組件意味著直接使用現成的組件,不用重復開發。使用 STL 最重要的是掌握基本理論和編程方法,了解 STL 編程技術,必須深刻掌握 STL 容器技術和 STL 迭代器技術。
STL 提供了一組表示容器、迭代器、仿函數和算法的模板:
STL 使程序員能夠構造各種容器和執行各種操作。
下面以矢量為例,簡要講述矢量模板的使用。
在數學計算和 STL 模板中, 對應數組,提供與 和 類似的操作。而 STL 為使 矢量具備通用性,在頭文件 中定義了 模板。具體方法為:創建 模板對象,使用通常的 表示法指出要使用的類型;然后使用初始化參數決定矢量的大小,并定義矢量動態內存。例如:
#includeusing namespace std; //使用命名空間 std vector ratings (5); //定義矢量對象 int n; cin >> n; //輸入矢量大小 vector
scores (n); //定義矢量動態內存
內存分配器是用來管理對象內存的。在 STL 容器模板中,一般都有一個可選的模板參數。例如:
template>//矢量模板 class vector { ... }
若省略該模板參數的值,則容器模板將默認使用 類。類 以標準形式使用 new 和 內存管理方式。
下面舉例說明,創建兩個 對象:一個是 int 規范;另一個是 規范:
#include#include #include using namespace std; const int NUM = 5; int main () { vector names(NUM); //定義矢量對象 vector sexs (NUM); //同上 cout<<"Please Do Exactly As Told You Will enter \n"< 獲取輸入信息 cout << "Enter sex (0/1) #"; cin >> sexs [i]; //獲取輸入信息 cin.get (); //等待 } cout << "Thank you. You entered the following: \n"<< "name/sex" << endl; for (i = 0; i
輸出信息 { cout < 程序執行結果為:
Do As Told You Will enter
5 Name and Their Sex.
Enter title # 1: A
Enter sex (0/1) #1
Enter title # 2: B
Enter sex (0/1) #1
Enter title # 3: D
Enter sex (0/1) #0
Enter title # 4: E
Enter sex (0/1) #1
Enter title # 5: E
Enter sex (0/1) #1
Thank you. You the :
name/sex
A 1
B 1
D 0
E 1
E 1