Ⅰ STL是什麼意思
什麼是STL呢?STL就是Standard
Template
Library,標准模板庫。這可能是一個歷史上最令人興奮的工具的最無聊的術語。從根本上說,STL是一些「容器」的集合,這些「容器」有list,vector,set,map等,STL也是演算法和其他一些組件的集合。這里的「容器」和演算法的集合指的是世界上很多聰明人很多年的傑作。
STL的目的是標准化組件,這樣就不用重新開發,可以使用現成的組件。STL現在是C++的一部分,因此不用額外安裝什麽。它被內建在你的編譯器之內。因為STL的list是一個簡單的容器,所以我打算從它開始介紹STL如何使用。如果你懂得了這個概念,其他的就都沒有問題了。另外,list容器是相當簡單的,我們會看到這一點。
在本文中我們將會看到如何定義和初始化一個list,計算它的元素的數量,從一個list里查找元素,刪除元素,和一些其他的操作。要作到這些,我們將會討論兩個不同的演算法,STL通用演算法都是可以操作不止一個容器的,而list的成員函數是list容器專有的操作。
這是三類主要的STL組件的簡明綱要。STL容器可以保存對象,內建對象和類對象。它們會安全的保存對象,並定義我們能夠操作的這個對象的介面。放在蛋架上的雞蛋不會滾到桌上。它們很安全。因此,在STL容器中的對象也很安全。我知道這個比喻聽起來很老土,但是它很正確。
STL演算法是標准演算法,我們可以把它們應用在那些容器中的對象上。這些演算法都有很著名的執行特性。它們可以給對象排序,刪除它們,給它們記數,比較,找出特殊的對象,把它們合並到另一個容器中,以及執行其他有用的操作。
http://www.yesky.com/255/1910755.shtml
還有一種解釋:
什麼是STL?
STL代表科學和技術素養,但這個短語的背後隱藏的重要意義是對所有人而言。
STL也許可以簡單地視為一個哲學觀點,但決不僅僅如此。它包括了一套完整的教育方法,這個方法包含生活中的科學技術和不僅是學校師生的還有普通市民和政治家在內的所有人的思想。
為了達到普及科學技術的要求,科學技術的排它性和教師\科學家對科學教育的態度要根本轉變。
課堂中的科學教育要從教師為主導、以教學大綱為核心的教育方式中解脫出來,代之以學生為中心來設計、指導和進行組織教學。為了使學生全身心投入學習動機是非常重要的而且這將只有在科學技術成為學生日常生活的需要時才能得到激發。
考慮到這些,我們現在是現代世界的一部分,這種意識比以前更為強烈,知識的獲取與事實的記憶日益無關。一個微型行動電話能夠直接接入網際網路。這是能夠在我們的指尖表達出一些事實信息。結果是學生在大量的事實學習(這是很快過時的知識)的思維負擔是明顯無意義的。
一旦這些負擔被減輕了,全體學生親自感受科學和技術的潛能就能被發掘出來。科學和技術不再被看作僅僅是』最聰明的』學生的寶貝。批判性思維得到解放。這些能揭示挑戰不可靠信息和無確實根據的個人觀點的思維方法,不管這些觀點是來自』專家』,還是廣告代理商或者政治家們。
現存的許多科學技術的排它性營造了道德和價值觀來自於藝術和人文的氛圍。實際上許多當前
Ⅱ stl是什麼文件
STL = Standard Template Library,標准模板庫,惠普實驗室開發的一系列軟體的統稱。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普實驗室工作時所開發出來的。這可能是一個歷史上最令人興奮的工具的最無聊的術語。從根本上說,STL是一些「容器」的集合,這些「容器」有list,vector,set,map等,STL也是演算法和其他一些組件的集合。這里的「容器」和演算法的集合指的是世界上很多聰明人很多年的傑作。STL的目的是標准化組件,這樣就不用重新開發,可以使用現成的組件。STL現在是C++的一部分,因此不用額外安裝什麼。
目錄
標准模板庫演算法
容器
迭代器
科學和技術素養
司太立特合金
中國星際戰隊聯賽
北京大學國際法學院
一種3D模型文件格式
台達PLC命令
夢幻西遊門派
操作應用標准模板庫 演算法
容器
迭代器
科學和技術素養
司太立特合金
中國星際戰隊聯賽
北京大學國際法學院
一種3D模型文件格式
台達PLC命令
夢幻西遊門派
操作應用展開 編輯本段標准模板庫
STL被內建在你的編譯器之內。 在C++標准中,STL被組織為下面的13個頭文件:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility>。
演算法
大家都能取得的一個共識是函數庫對數據類型的選擇對其可重用性起著至關重要的作用。舉例來說,一個求方根的函數,在使用浮點數作為其參數類型的情況下的可重用性肯定比使用整型作為它的參數類性要高。而C++通過模板的機制允許推遲對某些類型的選擇,直到真正想使用模板或者說對模板進行特化的時候,STL就利用了這一點提供了相當多的有用演算法。它是在一個有效的框架中完成這些演算法的——你可以將所有的類型劃分為少數的幾類,然後就可以在模版的參數中使用一種類型替換掉同一種類中的其他類型。 STL提供了大約100個實現演算法的模版函數,比如演算法for_each將為指定序列中的每一個元素調用指定的函數,stable_sort以你所指定的規則對序列進行穩定性排序等等。這樣一來,只要我們熟悉了STL之後,許多代碼可以被大大的化簡,只需要通過調用一兩個演算法模板,就可以完成所需要的功能並大大地提升效率。 演算法部分主要由頭文件<algorithm>,<numeric>和<functional>組成。<algorithm>是所有STL頭文件中最大的一個(盡管它很好理解),它是由一大堆模版函數組成的,可以認為每個函數在很大程度上都是獨立的,其中常用到的功能范圍涉及到比較、交換、查找、遍歷操作、復制、修改、移除、反轉、排序、合並等等。<numeric>體積很小,只包括幾個在序列上面進行簡單數學運算的模板函數,包括加法和乘法在序列上的一些操作。<functional>中則定義了一些模板類,用以聲明函數對象。
容器
在實際的開發過程中,數據結構本身的重要性不會遜於操作於數據結構的演算法的重要性,當程序中存在著對時間要求很高的部分時,數據結構的選擇就顯得更加重要。 經典的數據結構數量有限,但是我們常常重復著一些為了實現向量、鏈表等結構而編寫的代碼,這些代碼都十分相似,只是為了適應不同數據的變化而在細節上有所出入。STL容器就為我們提供了這樣的方便,它允許我們重復利用已有的實現構造自己的特定類型下的數據結構,通過設置一些模版類,STL容器對最常用的數據結構提供了支持,這些模板的參數允許我們指定容器中元素的數據類型,可以將我們許多重復而乏味的工作簡化。 容器部分主要由頭文件<vector>,<list>,<deque>,<set>,<map>,<stack>和<queue>組成。對於常用的一些容器和容器適配器(可以看作由其它容器實現的容器),可以通過下表總結一下它們和相應頭文件的對應關系。 數據結構 描述 實現頭文件
向量(vector) 連續存儲的元素 <vector>
列表(list) 由節點組成的雙向鏈表,每個結點包含著一個元素 <list>
雙隊列(deque) 連續存儲的指向不同元素的指針所組成的數組 <deque>
集合(set) 由節點組成的紅黑樹,每個節點都包含著一個元素,節點之間以某種作用於元素對的謂詞排列,沒有兩個不同的元素能夠擁有相同的次序 <set>
多重集合(multiset) 允許存在兩個次序相等的元素的集合 <set>
棧(stack) 後進先出的值的排列 <stack>
隊列(queue) 先進先出的值的排列 <queue>
優先隊列(priority_queue) 元素的次序是由作用於所存儲的值對上的某種謂詞決定的的一種隊列 <queue>
映射(map) 由{鍵,值}對組成的集合,以某種作用於鍵對上的謂詞排列 <map>
多重映射(multimap) 允許鍵對有相等的次序的映射 <map>
迭代器
下面要說的迭代器從作用上來說是最基本的部分,可是理解起來比前兩者都要費力一些(至少筆者是這樣)。軟體設計有一個基本原則,所有的問題都可以通過引進一個間接層來簡化,這種簡化在STL中就是用迭代器來完成的。概括來說,迭代器在STL中用來將演算法和容器聯系起來,起著一種黏和劑的作用。幾乎STL提供的所有演算法都是通過迭代器存取元素序列進行工作的,每一個容器都定義了其本身所專有的迭代器,用以存取容器中的元素。 迭代器部分主要由頭文件<utility>,<iterator>和<memory>組成。<utility>是一個很小的頭文件,它包括了貫穿使用在STL中的幾個模板的聲明,<iterator>中提供了迭代器使用的許多方法,而對於<memory>的描述則十分的困難,它以不同尋常的方式為容器中的元素分配存儲空間,同時也為某些演算法執行期間產生的臨時對象提供機制,<memory>中的主要部分是模板類allocator,它負責產生所有容器中的默認分配器。
Ⅲ STL是什麼
什麼是STL呢?STL就是Standard Template Library,標准模板庫。這可能是一個歷史上最令人興奮的工具的最無聊的術語。從根本上說,STL是一些「容器」的集合,這些「容器」有list,vector,set,map等,STL也是演算法和其他一些組件的集合。這里的「容器」和演算法的集合指的是世界上很多聰明人很多年的傑作。
STL的目的是標准化組件,這樣就不用重新開發,可以使用現成的組件。STL現在是C++的一部分,因此不用額外安裝什麽。它被內建在你的編譯器之內。因為STL的list是一個簡單的容器,所以我打算從它開始介紹STL如何使用。如果你懂得了這個概念,其他的就都沒有問題了。另外,list容器是相當簡單的,我們會看到這一點。
在本文中我們將會看到如何定義和初始化一個list,計算它的元素的數量,從一個list里查找元素,刪除元素,和一些其他的操作。要作到這些,我們將會討論兩個不同的演算法,STL通用演算法都是可以操作不止一個容器的,而list的成員函數是list容器專有的操作。
這是三類主要的STL組件的簡明綱要。STL容器可以保存對象,內建對象和類對象。它們會安全的保存對象,並定義我們能夠操作的這個對象的介面。放在蛋架上的雞蛋不會滾到桌上。它們很安全。因此,在STL容器中的對象也很安全。我知道這個比喻聽起來很老土,但是它很正確。
STL演算法是標准演算法,我們可以把它們應用在那些容器中的對象上。這些演算法都有很著名的執行特性。它們可以給對象排序,刪除它們,給它們記數,比較,找出特殊的對象,把它們合並到另一個容器中,以及執行其他有用的操作。
http://www.yesky.com/255/1910755.shtml
還有一種解釋:
什麼是STL?
STL代表科學和技術素養,但這個短語的背後隱藏的重要意義是對所有人而言。
STL也許可以簡單地視為一個哲學觀點,但決不僅僅如此。它包括了一套完整的教育方法,這個方法包含生活中的科學技術和不僅是學校師生的還有普通市民和政治家在內的所有人的思想。
為了達到普及科學技術的要求,科學技術的排它性和教師\科學家對科學教育的態度要根本轉變。
課堂中的科學教育要從教師為主導、以教學大綱為核心的教育方式中解脫出來,代之以學生為中心來設計、指導和進行組織教學。為了使學生全身心投入學習動機是非常重要的而且這將只有在科學技術成為學生日常生活的需要時才能得到激發。
考慮到這些,我們現在是現代世界的一部分,這種意識比以前更為強烈,知識的獲取與事實的記憶日益無關。一個微型行動電話能夠直接接入網際網路。這是能夠在我們的指尖表達出一些事實信息。結果是學生在大量的事實學習(這是很快過時的知識)的思維負擔是明顯無意義的。
一旦這些負擔被減輕了,全體學生親自感受科學和技術的潛能就能被發掘出來。科學和技術不再被看作僅僅是』最聰明的』學生的寶貝。批判性思維得到解放。這些能揭示挑戰不可靠信息和無確實根據的個人觀點的思維方法,不管這些觀點是來自』專家』,還是廣告代理商或者政治家們。
現存的許多科學技術的排它性營造了道德和價值觀來自於藝術和人文的氛圍。實際上許多當前
Ⅳ 初識電腦對電腦中的英文不了解.可以告訴一些常用的常見的電腦術語么
一群性質相近同的「東西」,如果譯名一貫,閱讀的感覺就很好。
一貫性的術語,擴充性高,延伸性高,系統化高。
● 我喜歡「式」:
constructor 建構式
declaration 宣告式
definition 定義式
destructor 解構式
expression 算式(運算式)
function 函式
pattern 範式、模式、樣式
program 程式
signature 標記式
● 我喜歡「件」:(這是個彈性非常大的可組合字)
assembly (裝)配件
component 組件
construct 構件
control 控制項
event 事件
hardware 硬體
object 物件
part 零件、部件
singleton 單件
software 軟體
work 工件、機件
● 我喜歡「器」:
adapter 配接器
allocator 配置器
compiler 編譯器
container 容器
iterator 迭代器
linker 聯(連)結器
listener 監聽器
● 我喜歡「別」:
class 類別
type 型別
● 我喜歡「化」:
generalized 泛化
specialized 特化
overloaded 多載化(重載)
● 我喜歡「型」:
polymorphism 多型
genericity 泛型
● 我喜歡「程」:
process 行程(or 進程,大陸用語)
thread 線程(大陸用語)
programming 編程
●英中繁簡編程術語對照
英文 繁體譯詞
(有些是侯捷個人喜好,普及與否難說) 大陸慣用術語
---------------------------------------------------------------------------------------
#define 定義 預定義
abstract 抽象的 抽象的
abstraction 抽象體、抽象物、抽象性 抽象體、抽象物、抽象性
access 存取、取用 存取、訪問
access function 存取函式 存取函數
activate
active
adapter 配接器 適配器
address 位址 地址
address space 位址空間,定址空間
address-of operator 取址運運算元 取地址運算符
aggregation 聚合
algorithm 演演算法 演算法
allocate 配置 分配
allocator (空間)配置器 分配器
application 應用程式 應用、應用程序
application framework 應用程式框架、應用框架 應用程序框架
argument 引數(傳給函式的值)。叄見 parameter 叄數、實質叄數、實叄、自變數
array 陣列 數組
arrow operator arrow(箭頭)運運算元 箭頭運算符
assembly 配件
assembly language 組合語言 匯編語言
assign 指派、指定、設值、賦值 賦值
assignment 指派、指定 賦值、分配
assignment operator 指派(賦值)運運算元 = 賦值運算符
associated 相應的、相關的 相關的、關聯、相應的
associative container 關聯式容器(對應 sequential container) 關聯式容器
atomic 不可分割的 原子的
attribute 屬性 特性
background 背景 背景(用於圖形著色)
後台(用於行程)
base class 基礎類別 基類
base type 基礎型別 (等同於 base class)
batch 批次(意思是整批作業) 批處理
best viable function 最佳可行函式 最佳可行函式
(從 viable functions 中挑出的最佳吻合者)
binary search 二分搜尋法 二分查找
binary tree 二元樹 二叉樹
binary operator 二元運運算元 二元運算符
binding 系結 綁定
bit 位元 位
bit field 位元欄 ? 位域
bitmap 位元圖 ? 點陣圖
bitwise 以 bit 為單元逐一┅ ?
bitwise 以 bit 為單元進行復制;位元逐一復制 位拷貝
block 區塊 塊、區塊、語句塊
boolean 布林值(真假值,true 或 false) 布爾值
border 邊框、框線 邊框
brace(curly brace) 大括弧、大括弧 花括弧、花括弧
bracket(square brakcet) 中括弧、中括弧 方括弧、方括弧
breakpoint 中斷點 斷點
build-in 內建 內置
bus 匯流排
byte 位元組(由 8 bits 組成) 位元組
cache 快取 高速緩存
call 呼叫、叫用 調用
callback 回呼 回調
call operator call(函式呼叫)運運算元 () 調用運算符
(同 function call operator)
candidate function 候選函式 候選函數
(在函式多載決議程序中出現的候選函式)
chain 串鏈(例 chain of function calls) 鏈
character 字元 字元
check box 核取方塊 (i.e. check button) 復選框
check button 方鈕 (i.e. check box) 復選按鈕
child class 子類別(或稱為derived class, subtype) 子類
class 類別 類
class body 類別本體 類體 ?
class declaration 類別宣告、類別宣告式 類聲明
class definition 類別定義、類別定義式 類定義
class derivation list 類別衍化列 類繼承列表
class head 類別表頭 類頭 ?
class hierarchy 類別繼承體系, 類別階層 類層次體系
class library 類別程式庫、類別庫 類庫
class template 類別模板、類別範本 類模板
class template partial specializations
類別模板偏特化 類模板部分特化
class template specializations
類別模板特化 類模板特化
cleanup 清理、善後 清理、清除
client 客端、客戶端、用戶端 客戶端
client-server 主從架構 客戶/伺服器
clipboard 剪貼簿 剪貼板
clone 復制 克隆
(易與 混淆)
collection 群集 集合 ?
combo box 復合方塊、復合框 組合框
command line 命令列 命令行
(系統文字模式下的整行執行命令)
communication 通訊 通訊
compile time 編譯期 編譯期、編譯時
compiler 編譯器 編譯器
component 組件 組件
composition 復合、合成、組合 組合
computer 電腦、計算機 計算機、電腦
concrete 具象的 實在的
concurrent 並行 並發
configuration 組態 配置
container 容器 容器
(存放資料的某種結構如 list, vector...)
context 背景關系、周遭環境、上下脈絡 環境、上下文
control 控制元件、控制項 控制項
const 常數(constant 的縮寫,C++ 關鍵字)
constant 常數(相對於 variable) 常量、常數
constructor(ctor) 建構式 構造函數、構造器
(與class 同名的一種 member functions)
復制、拷貝 拷貝
cover 涵蓋 覆蓋
create 產生、生成 創建、生成
creation 產生、生成 創建、生成
data 資料 數據
data member 資料成員、成員變數 數據成員、成員變數
data structure 資料結構 數據結構
datagram 資料元 數據報文
dead lock 死結 死鎖
debug 除錯 調試
declaration 宣告、宣告式 聲明
dection 推導(例:template argument dection) 推導、推斷
default 預設 預設、默認
definition 定義、定義區、定義式 定義
delegate 委派、委託、委任
delegation (同上)
dereference 提領(取出指標所指物體的內容) 解叄考
dereference operator dereference(提領)運運算元 * 解叄考算符
derived class 衍生類別 派生類
design by contract 契約式設計
design pattern 設計樣式 設計模式
※ 最近我比較喜歡「設計範式」一詞
destructor(dtor) 解構式 析構函數、析構器
device 裝置、設備 設備
dialog 對話窗、對話盒 對話框
directive 指令(例:using directive) (編譯)指示符
directory 目錄 目錄
distributed computing 分布式計算 (分布式電算) 分布式計算
分散式計算 (分散式電算)
document 文件 文檔
dot operator dot(句點)運運算元 . (圓)點運算符
driver 驅動程式 驅動(程序)
dynamic binding 動態系結 動態綁定
efficiency 高效、效率、效能
entity 物體 實體、物體
encapsulation 封裝 封裝
enclosing class 外圍類別(與巢狀類別 nested class 有關)外圍類
enum (enumeration) 列舉(一種 C++ 資料型別) 枚舉
enumerators 列舉元(enum 型別中的成員) 枚舉成員、枚舉器
equality operator equality(等號)運運算元 == 等號運算符
evaluate 評估、求值、核定 評估
event 事件 事件
event driven 事件驅動的 事件驅動的
exception 異常情況 異常
exception declaration 異常宣告(ref. C++ Primer 3/e, 11.3) 異常聲明
exception handling 異常處理、異常處理機制 異常處理、異常處理機制
exception specification 異常規格(ref. C++ Primer 3/e, 11.4) 異常規范
exit 退離(指離開函式時的那一個執行點) 退出
explicit 明白的、明顯的、顯式 顯式
export 匯出 引出、導出
expression 運算式、算式 表達式
facility 設施、設備 設施、設備
feature 特性
field 欄位 欄位
file 檔案 文件
firmware 韌體 固件
flush 清理、掃清 刷新
form 表單(programming 用語)
formal parameter 形式叄數 形式叄數
forward declaration 前置宣告 前置聲明
fractal 碎形 分形
framework 框架 框架
full specialization 全特化(ref. partial specialization) ?
function 函式、函數 函數
function call operator 同 call operator
function object 函式物件(ref. C++ Primer 3/e, 12.3) 函數對象
function overloaded resolution
函式多載決議程序 函數重載解決(方案)
function template 函式模板、函式範本 函數模板
functor 仿函式 仿函式、函子
generic 泛型、一般化的 一般化的、通用的、泛化
generic algorithm 泛型演演算法 通用演算法
global 全域性的(對應於 local) 全局的
global scope resolution operator
全域生存空間(范圍決議)運運算元 :: 全局范圍解析運算符
group 群組 ?
group box 群組方塊 分組框
hand shaking 握手協商
handle 識別碼、識別號、號碼牌、權柄 句柄
handler 處理常式 處理函數
hardware 硬體 硬體
hash table 雜湊表 哈希表、散列表
header file 表頭檔、標頭檔 頭文件
heap 堆積 堆
hierarchy 階層體系 層次結構(體系)
hook 掛鉤 鉤子
hyperlink 超鏈結 超鏈接
IDE 整合開發環境 集成開發環境
identifier 識別字、識別符號 標識符
immediate base 直接的(緊臨的)上層 base class。 直接上層基類
immediate derived 直接的(緊臨的)下層 derived class。 直接下層派生類
implement 實作 實現
implementation 實作品、實作物、實作體、實作碼 實現
implicit 隱喻的、暗自的、隱式 隱式
import 匯入 導入
increment operator 累加運運算元 ++ 增加運算符
information 資訊 信息
infrastructure 公共基礎建設
inheritance 繼承、繼承機制 繼承、繼承機制
inline 行內 內聯
inline expansion 行內展開 內聯展開
initialization 初始化(動作) 初始化
initialization list 初值列 初始值列表
initialize 初始化 初始化
instance 實體 實例
(根據某種表述而實際產生的「東西」)
instantiated 具現化、實體化(常應用於 template) 實例化
instantiation 具現體、具現化實體(常應用於 template) 實例
integrate 整合 集成
interface 介面 介面
invoke 喚起 調用
iterate 迭代(迴圈一個輪回一個輪回地進行) 迭代
iterative 反覆的,迭代的
iterator 迭代器(一種泛型指標) 迭代器
iteration 迭代(迴圈每次輪回稱為一個 iteration) 迭代
item 項目、條款 項、條款、項目
laser 雷射 激光
level 階 層
例 high level 高階 高層
library 程式庫、函式庫 庫、函數庫
lifetime 生命期、壽命 生命期、壽命
link 聯結、連結 連接
linker 聯結器、連結器 連接器
literal constant 字面常數(例 3.14 或 "hi" 這等常數值) 字面常數
list 串列(linked-list) 列表、表、鏈表
list box 列表方塊、列表框 列表框
load 載入 裝載、載入
loader 載入器 裝載器、載入器
local 區域性的(對應於 global) 局部的
lock 機鎖
loop 迴圈 循環
lvalue 左值 左值
macro 巨集 宏
maintain 維護 維護
manipulator 操縱器(iostream 預先定義的一種東西) 操縱器
mechanism 機制 機制
member 成員 成員
member access operator 成員取用運運算元(有 dot 和 arrow 兩種) 成員存取運算符
member function 成員函式 成員函數
member initialization list
成員初值列 成員初始值列表
memberwise 以 member 為單元┅、members 逐一┅ 以成員為單位
memberwise 以 members 為單元逐一復制
memory 記憶體 內存
menu 表單、選單 菜單
message 訊息 消息
message based 以訊息為基礎的 基於消息的
message loop 訊息迴圈 消息環
method (java) 方法、行為
micro 微 微
modeling 模塑
modeling language 塑模語言,建模語言
mole 模組 模塊
most derived class 最末層衍生類別 最底層的派生類
mouse 滑鼠 滑鼠
mutable 可變的 可變的
multi-tasking 多工 多任務
namespace 命名空間 名字空間、命名空間
nested class 巢狀類別 嵌套類
object 物件 對象
object based 以物件為基礎的 基於對象的
object model 物件模型 對象模型
object oriented 物件導向的 面向對象的
online 線上 在線
operand 運算元 操作數
operating system (OS)
Ⅳ 什麼是STL
它是由Alexander Stepanov、Meng Lee和David R Musser在惠普實驗室工作時所開發 出來的。現在雖說它主要出現在C++中,但在被引入C++之前該技術就已經存在了很長的 一段時間。 STL的代碼從廣義上講分為三類:algorithm(演算法)、container(容器)和iterator( 迭代器),幾乎所有的代碼都採用了模板類和模版函數的方式,這相比於傳統的由函數 和類組成的庫來說提供了更好的代碼重用機會。在C++標准中,STL被組織為下面的13個 頭文件:、、、、、、、、、、、和。以下筆者就簡單 介紹一下STL各個部分的主要特點。 二、演算法 大家都能取得的一個共識是函數庫對數據類型的選擇對其可重用性起著至關重要的作用 。舉例來說,一個求方根的函數,在使用浮點數作為其參數類型的情況下的可重用性肯 定比使用整型作為它的參數類性要高。而C++通過模板的機制允許推遲對某些類型的選擇 ,直到真正想使用模板或者說對模板進行特化的時候,STL就利用了這一點提供了相當多 的有用演算法。它是在一個有效的框架中完成這些演算法的——你可以將所有的類型劃分為 少數的幾類,然後就可以在模版的參數中使用一種類型替換掉同一種類中的其他類型。 STL提供了大約100個實現演算法的模版函數,比如演算法for_each將為指定序列中的每一個 元素調用指定的函數,stable_sort以你所指定的規則對序列進行穩定性排序等等。這樣 一來,只要我們熟悉了STL之後,許多代碼可以被大大的化簡,只需要通過調用一兩個算 法模板,就可以完成所需要的功能並大大地提升效率。 演算法部分主要由頭文件,和組成。是所 有STL頭文件中最大的一個(盡管它很好理解),它是由一大堆模版函數組成的,可以認 為每個函數在很大程度上都是獨立的,其中常用到的功能范圍涉及到比較、交換、查找 、遍歷操作、復制、修改、移除、反轉、排序、合並等等。體積很小,只包括 幾個在序列上面進行簡單數學運算的模板函數,包括加法和乘法在序列上的一些操作。 中則定義了一些模板類,用以聲明函數對象。 三、容器 在實際的開發過程中,數據結構本身的重要性不會遜於操作於數據結構的演算法的重要性 ,當程序中存在著對時間要求很高的部分時,數據結構的選擇就顯得更加重要。 經典的數據結構數量有限,但是我們常常重復著一些為了實現向量、鏈表等結構而編寫 的代碼,這些代碼都十分相似,只是為了適應不同數據的變化而在細節上有所出入。ST L容器就為我們提供了這樣的方便,它允許我們重復利用已有的實現構造自己的特定類型 下的數據結構,通過設置一些模版類,STL容器對最常用的數據結構提供了支持,這些模 板的參數允許我們指定容器中元素的數據類型,可以將我們許多重復而乏味的工作簡化 。 容器部分主要由頭文件,,,,,和組成 。對於常用的一些容器和容器適配器(可以看作由其它容器實現的容器),可以通過下 表總結一下它們和相應頭文件的對應關系。 數據結構 描述 實現頭文件 向量(vector) 連續存儲的元素 列表(list) 由節點組成的雙向鏈表,每個結點包含著一個元素 雙隊列(deque) 連續存儲的指向不同元素的指針所組成的數組 集合(set) 由節點組成的紅黑樹,每個節點都包含著一個元素,節點之間以某種作用於 元素對的謂詞排列,沒有兩個不同的元素能夠擁有相同的次序 多重集合(multiset) 允許存在兩個次序相等的元素的集合 棧(stack) 後進先出的值的排列 隊列(queue) 先進先出的執的排列 優先隊列(priority_queue) 元素的次序是由作用於所存儲的值對上的某種謂詞決定的的 一種隊列 映射(map) 由{鍵,值}對組成的集合,以某種作用於鍵對上的謂詞排列 多重映射(multimap) 允許鍵對有相等的次序的映射 四、迭代器 下面要說的迭代器從作用上來說是最基本的部分,可是理解起來比前兩者都要費力一些 (至少筆者是這樣)。軟體設計有一個基本原則,所有的問題都可以通過引進一個間接 層來簡化,這種簡化在STL中就是用迭代器來完成的。概括來說,迭代器在STL中用來將 演算法和容器聯系起來,起著一種黏和劑的作用。幾乎STL提供的所有演算法都是通過迭代器 存取元素序列進行工作的,每一個容器都定義了其本身所專有的迭代器,用以存取容器 中的元素。 迭代器部分主要由頭文件,和組成。是一個很小 的頭文件,它包括了貫穿使用在STL中的幾個模板的聲明,中提供了迭代器使 用的許多方法,而對於的描述則十分的困難,它以不同尋常的方式為容器中的 元素分配存儲空間,同時也為某些演算法執行期間產生的臨時對象提供機制,中的 主要部分是模板類allocator,它負責產生所有容器中的默認分配器。 五、對初學者學習STL的一點建議 對於之前不太了解STL的讀者來說,上面的文字只是十分概括地描述了一下STL的框架, 對您理解STL的機制乃至使用STL所起到的幫助微乎甚微,這不光是因為深入STL需要對C ++的高級應用有比較全面的了解,更因為STL的三個部分演算法、容器和迭代器三部分是互 相牽制或者說是緊密結合的。從概念上講最基礎的部分是迭代器,可是直接學習迭代器 會遇到許多抽象枯燥和繁瑣的細節,然而不真正理解迭代器又是無法直接進入另兩部分 的學習的(至少對剖析源碼來說是這樣)。可以說,適應STL處理問題的方法是需要花費 一定的時間的,但是以此為代價,STL取得了一種十分可貴的獨立性,它通過迭代器能在 盡可能少地知道某種數據結構的情況下完成對這一結構的運算,所以下決心鑽研STL的朋 友們千萬不要被一時的困難擊倒。其實STL運用的模式相對統一,只要適應了它,從一個 STL工具到另一個工具,都不會有什麼大的變化。 對於STL的使用,也普遍存在著兩種觀點。第一種認為STL的最大作用在於充當經典的數 據結構和演算法教材,因為它的源代碼涉及了許多具體實現方面的問題。第二種則認為ST L的初衷乃是為了簡化設計,避免重復勞動,提高編程效率,因此應該是「應用至上」的 ,對於源代碼則不必深究。筆者則認為分析源代碼和應用並不矛盾,通過分析源代碼也 能提高我們對其應用的理解,當然根據具體的目的也可以有不同的側重。