標準模板庫（，縮寫：STL），是一個 C 軟體庫，大量影響了 C 標準程式庫但並非是其的一部分。其中包含 4 個元件，分別為演算法、容器、函式、迭代器。 模板是 C 程式設計語言中的一個重要特徵，而標準模板庫正是基於此特徵。標準模板庫使得 C 程式語言在有了同 Java 一樣強大的類庫的同時，保有了更大的可擴充套件性。 歷史 標準模板庫係由創造於 1979 年前後，這也正是比雅尼斯特勞斯特魯普創造 C 的年代。 雖然於 1971 年開始即在計算機幾何領域發展並倡導某些泛型程式設計觀念，但早期並沒有任何程式語言支援泛型程式設計。 Alex 和 Musser 曾於 1987 開發出一套相關的 Ada library 標準模板庫設計人 Stepanov 早期從事教育工作，1970 年代研究泛型程式設計，那時他與其同事一起在 GE 公司開發出一個新的程式語言 Tecton。 1983 年，Stepanov 先生轉至紐約大學坦登工程學院擔任助理教授，繼續研究泛型程式設計，同時寫了許多 Scheme 的程式，應用在 graph 與 network 的演演算法上，1985 年又轉至 GE 公司專門教授高階程式設計，並將 graph 與 network 的 Scheme 程式，改用 Ada 寫，用了 Ada 以後，他發現到一個動態（dynamically）型別的程式（如 Scheme）與強制（strongly）型別的程式（如 Ada）有多麼的不同。 在動態型別的程式中，所有型別都可以自由的轉換成別的型別，而強制型別的程式卻不能。但是，強制型別在出錯時較容易發現程式錯誤。 1988 年 Stepanov 先生轉至 HP 公司執行開發泛型程式庫的工作。此時，他已經認識 C 語言中指標 pointer 的威力，他表示一個程式設計師只要有些許硬體知識，就很容易接受 C 語言中指標的觀念，同時也瞭解到 C 語言的所有資料結構均可以指標間接表示，這點是 C 與 Ada、Scheme 的最大不同。 Stepanov 並認為，雖然 C 中的繼承功能可以表示泛型設計，但終究有個限制。雖然可以在基礎型別（superclass）定義演算法和介面，但不可能要求所有物件皆是繼承這些，而且龐大的繼承體系將減低虛擬（virtual）函式的執行效率，這便違反的前面所說的「效率」原則。 到了 C 模板觀念，Stepanov 參加了許多有關的研討會，與 C 之父比雅尼討論模板的設計細節。如，Stepanov 認為 C 的函式模板（function template）應該像 Ada 一樣，在宣告其函式原型後，應該顯式的宣告一個函式模板之例項（instance）；比雅尼則不然，他認為可以透過 C 的過載（overloading）功能來表達。 Stepanov 想像中的函式模板： in hpp templateclass T T square T x return xx in cpp double square double cout square 33 int square int cout square 3 比雅尼認為的函式模板： in hpp templateclass T T square T x return xx in cpp cout square 33 cout square 3 幾經爭辯，Stepanov 發現比雅尼是對的（參考侯俊傑標準模板庫講座第三章）。事後 Stepanov 回想起來非常同意比雅尼的作法。 事實上，C 的模板，本身即是一套複雜的巨集語言（macro language），巨集語言最大的特色為：所有工作在編譯時期就已完成。顯式的宣告函式模板之例項，與直接透過 C 的多載功能隱式宣告，結果一樣，並無很大區別，只是前者加重程式設計師的負擔，使得程式變得累贅。 1992 年 Meng Lee 加入 Alex 的專案，成為另一位主要貢獻者。 1992 年，HP 泛型程式庫計畫結束，小組解散，只剩下 Stepanov 先生與 Meng Lee 小姐（她是東方人，標準模板庫的英文名稱其實是取 STepanov 與 Lee 而來 ），Lee 先前研究的是編譯器的製作，對 C 的模板很熟，第一版的標準模板庫中許多程式都是 Lee 的傑作。 1993 年，Andy Koenig 到 zhcn 斯坦福大學；zhsg 斯坦福大學；zhtw 史丹佛大學；zhhk 史丹福大學；zhmo 史丹福大學 演講，Stepanov 便向他介紹標準模板庫，Koenig 聽後，隨即邀請 Stepanov 參加 1993 年 11 月的 ANSIISO C 標準化會議，並發表演講。 Bell 實驗室的 Andrew Koenig 於 1993 年知道標準模板庫研究計劃後，邀請 Alex 於是年 11 月的 ANSIISO C 標準委員會會議上展示其觀念。並獲得與會者熱烈的迴應。 1994 年 1 月 6 日，Koenig 寄封電子郵件給 Stepanov，表示如果 Stepanov 願意將標準模板庫的說明檔案撰寫齊全，在 1 月 25 日前提出，便可能成為標準 C 的一部份。Stepanov 回信道：Andy are you crazy 。 Koenig 便說：Well yes I am crazy but why not try it。 Alex 於是在次年夏天在滑鐵盧舉行的會議前完成其正式的提案，並以百分之八十壓倒性多數，一舉讓這個巨大的計劃成為 C Standard 的一部份。 標準模板庫於 1994 年 2 月年正式成為 ANSIISO C 的一部份，它的出現，促使 C 程式設計師的思維方式更朝向泛型程式設計（generic program）發展。 內容 STL 將 在資料上執行的操作 與 要執行操作的資料分開，分別以如下概念指代： 容器：包含、放置資料的地方。 迭代器：在容器中指出一個位置、或成對使用以劃定一個區域，用來限定操作所涉及到的資料範圍。 演算法：要執行的操作。 容器 標準模板庫包含了序列容器（sequence containers）與關聯容器（associative containers）。 資料容器 描述 序列容器 有序集 序列容器 有序集 vector 動態陣列，相容 C 語言陣列。vector 可以如同陣列一樣的存取方式，例如使用下標（operator ）運運算元，並記得自己的長度資訊（size），您也可以使用物件的方式來存取 vector（push_back、pop_back）。使用 vector 可以輕易地定義多維可調整型陣列（stdvectorstdvector ）。要使用 vector，必須含入 vector 表頭檔。vector 可在 O 1 內完成在末尾插入 移除元素，但在 vector 中間或開頭插入 移除元素，則需要消耗 O n 時間。 list list 容器是一個有序（Ordered）的資料結構（循序容器），每個元素中儲存著上一個元素和下一個元素的地址（指標），因此是一個雙向連結的連結串列。與 vector 相比，其元素的訪問速度較慢，而在已知元素位置的情況下，插入和刪除速度較快。STL 容器中唯一支援事務語義。 forward_list（單向連結串列） list 的單鏈表版，去掉了一些操作。 deque（雙端佇列） 可看做為能在常量時間內完成向開頭或結尾插入或刪除元素的 vector，但是修改之後，其迭代器的有效性就無法得到保障。 array 只能在初始化時指定大小的陣列，可視為內建陣列的封裝。 關聯容器 無序集 關聯容器 無序集 set 不重複元素的集合。 multiset 跟 set 具有相同功能，但允許重複的元素。 map 關聯陣列，每個元素含有兩個資料項，map 將一個數據項對映到另一個數據項中。 multimap 跟 map 具有相同功能，但允許重複的鍵值。 unordered_setunordered_multisetunordered_mapunordered_multimap 分別類似於集合、多重集合、對映、多重對映，但使用雜湊表實現。它的鍵（Keys）沒有排序（operator），但是必須存在一個從鍵型別到 size_t 的雜湊函式、且要求鍵之間可以判等（operator）。自 C11 起進入語言標準。 其他型別的容器 其他型別的容器 bitset 儲存系列位類似的固定大小的布林向量。實現按位運算，沒有迭代器，不是序列。可視為 stdarraybool N。若需要改變序列長度，可用 stdvectorbool。 valarray 數值型別的 stdvector。犧牲泛型能力而專為數值計算做了最佳化，例如在陣列上的 sin 操作可對陣列內所有數值取正弦。有些實現會對 stdvalarray 應用向量指令等最佳化手段。一個觀點是裡面全是數值型別的 valarray 才是數學意義上的向量，而可以泛型的 vector 更該叫 array 程式語言中的陣列。 迭代器 迭代器是泛化的指標，透過使用迭代器，開發者可以操作資料結構而無需關心其內部實現。根據迭代器的操作方式的不同，迭代器分為五種： 輸入迭代器 輸出迭代器 前向迭代器 雙向迭代器 隨機訪問迭代器 演算法 STL 提供了一些常見 的演算法，如排序和搜尋等。這些演算法與資料結構的實現進行了分離。因此，也可對自定義的資料結構使用這些演算法，只需讓這些自定義的資料結構擁有演算法所預期的迭代器。。 函式物件 狹義的函式物件即過載了運算子 的類的例項，而廣義來講所有可用 x 形式呼叫的 x 都可稱為函式物件、或曰可呼叫物件。。 介面卡（Adaptor） 介面卡為一個模板類，用於提供介面對映。。 與 C 標準程式庫的差異 一個常見的誤解是 STL 是 C 標準程式庫的一部分，但事實上並非如此。例如 hash table 的資料結構實作在 STL 中有 hash_map 模板可供呼叫，但 C 標準程式庫一直到 C11 才加入了 unordered_map。參見無序關聯容器_STL。 參考文獻 參見 C 標準程式庫 外部連結 CC reference includes a section on the STL STL programmers guide official guide from SGI Bjarne Stroustrup on The emergence of the STL Page 5 Section 31 Apache stdcxx portable Open Source implementation based on Rogue Wave STL STLport multiplatform STL implementation Dinkumware commercial STL implementation ships with Visual C and several other compilers Rogue Wave STL Class Reference MPTL sharedmemory parallel extension of the STL using the Native POSIX Thread Library。 STXXL an STL implementation for external memory STLSoft libraries ：opensource 100 headeronly CC libraries of technologyspecific facades and STL extensions S S S