?? c++標準程序庫.txt
字號:
C++標準程序庫(The C++ Standard Library)
標準程序庫提供:
[1] 基本的運行期之語言支持(run-time language support)(比如運行期內存分配、運行期型別識別等);
[2] C語言標準程序庫(為了使其與類型系統的沖突降到最低,進行了一些微小的修改);
[3] strings和輸入輸出流(附帶對國際字符集和本地化的支持);
[4] 一個container framework(比如vector,list和map等)以及使用這些container的算法(比如通用的遍歷、排序以及合并算法);
[5] 對數值計算的支持(復數以及向量的算術運算;類BLAS的、通用的slices;有利于優化處理的語意設計)。
將一個類包含在程序庫里的主要原則有:這個類應該可能被幾乎所有的C++程序員(不管是新手還是專家)使用;這個類應該以一種通用的形式被提供,但與實現相同功用的、更簡單的形式相比,又不會帶來明顯的負荷;其基本用法很容易學會。總的來說,C++標準庫提供了最常用的基本數據結構以及使用這些數據結構的基本算法。
由container、iterator和算法形成的framework通常被稱為STL。STL基本上是Alexander Stepanov的研究成果[Stepanov,1994]。
6.1 string和I/O(輸入/輸出)
在C++中,string和I/O操作并不是直接由某種特殊的語言結構提供的。標準程序庫提供了string和一些I/O型別。例如:
#include <string> // 使標準string設施成為可用的
#include <iostream> // 使標準I/O設施成為可用的
int main()
{
using namespace std;
string name;
cout << “Please enter your name: “; // 提示用戶
cin >> name; // 讀取一個名稱
cout << “Hello, “ << name << ‘\n’; // 輸出名稱,后跟一個“新行符”
return 0;
}
這個例子使用了標準輸入流cin、標準輸出流cout,以及它們所需要的>>運算符(意即“取自某處”)和<<運算符(意即“放到某處”)。
I/O流支持多種格式化和緩沖設施;string支持諸如聯結、插入、從串中取字符之類的常用操作。流和string可以用于任何字符集。
標準程序庫的設施可以(也經常就是)只利用面向用戶的設施來實現。因此即使標準設施有時還不夠用,用戶也可以自己提供同樣優雅的替代方案。
6.2 Container
標準程序庫提供了一些最有用也最通用的container型別,從而使程序員能夠從中選擇最能滿足應用需要的container:
[標準container概要]
l l vector<T> 大小可變的向量
l l list<T> 雙向鏈表
l l queue<T> 隊列
l l stack<T> 棧
l l deque<T> 雙端隊列
l l priority_queue<T> 按值排序的隊列
l l set<T> 集合
l l multiset<T> 允許出現重復元素的集合
l l map<key,val> 關聯數組
l l multimap<key,val> 允許出現重復key值的關聯數組
這些container不但被設計得具有高效性,而且還提供了接口,使我們可以在任何適當的地方交替的使用它們。例如,list、vector等就提供了把元素追加到末尾的高效操作。這使得那些需要高效的經由下標對其進行訪問的數據可以按照“增量”的方式被構造。舉個例子:
vector<Point> cities;
void add_points(Point sentinel)
{
Point buf;
While (cin >> buf) { // 從輸入端讀取結點信息
If (buf == sentinel) return;
//
cities.push_back(buf); // 把結點加入vecotr(的末尾)
}
}
container對元素沒有什么強制性的限制;這即是說,所有的型別從本質上而言都可以被作為container中元素的型別。特別的是,像int和char*這樣的內建型別以及C語言風格的數據結構(即結構體struct)也可以被作為container中元素的型別。
6.3 算法(Algorithms)
標準程序庫提供了成打的算法。這些算法在namespace std的范圍內定義,可以通過#include <algorithm>來獲得使用權。下面列出我認為特別有用的部分算法:
[標準算法摘錄]
l l for_each() 對每一個元素都喚起(調用)一個函數
l l find() 查找第一個能與引數匹配的元素
l l find_if() 查找第一個能與謂詞(predicate)匹配的元素
l l count() 計算元素出現的次數
l l count_if() 計算能與謂詞匹配的元素個數
l l replace() 用新的值替換元素
l l replace_if() 用新的值替換能與謂詞匹配的元素
l l copy() 復制(拷貝)元素
l l unique_copy() 復制(拷貝)不是鄰近副本的元素
l l sort() 對元素排序
l l equal_range() 查找所有元素值相等的元素
l l merge() 合并有序的序列
上述這些算法以及標準程序庫中其它算法都可以應用于標準container、string和內建數組。實際上,所有算法都可以應用于§4.5.1中描述的任何一種序列(如下圖):
如前文所述,*運算符意即“經由一個iterator訪問元素”;++運算符意即“使iterator指向下一個元素”。例如,我們可以實現一個通用的算法,其任務是從一個序列中找到第一個能匹配謂詞的元素:
template<class In, class Predicate> In find if(In first, In last, Predicate pred)
{
while (first != last && !pred(*first)) ++first;
return first;
}
這些通用且普適的算法從三個方面說明了它們比大多數相應的傳統算法要優秀:簡單的定義;能根據輸入序列的型別在編譯期間選擇合適的算法;能對簡單的操作(比如==、<和簡單的用戶自定義謂詞)施行內聯處理。
6.4 數字(Numerics)
與C一樣,C++并不是意欲面向數字計算的語言。然而,C++還是擁有許多面向數字計算的部分——標準程序庫就很好的反映了這一點。
6.4.1 復數(Complex Numbers)
依照§4.1中描述的complex類,標準程序庫支持一系列的復數型別。為了使復數中分量的型別可以是單精度浮點數(float)、雙精度浮點數(double)以及其它各種型別,標準程序庫中的complex以模板實現:
template<class scalar> class complex {
public:
complex(scalar re, scalar im);
// …
};
這個復數模板支持常見的算術操作以及最常用的一些數學函數。例如:
template<class C> complex<C> pow(const complex<C>&, int);//
void f(complex<float> fl, complex<double> db)
{
complex<long double> ld = fl + sqrt(db);
db += fl * 3;
fl = pow(1 / fl, 2);
// …
}
由此可知,C++對復數型別的支持程度形同對浮點數型別的支持。
6.4.2 向量計算(Vector Arithmetic)
我們在§6.2中講到過標準vector,其設計目標就是使其成為一個具有可適應性的、通用的機制,專門用來存放各種數據值,并且能很好的配嵌于由container、iterator和算法組成的體系結構中。然而標準vector并不支持向量的算術操作。為vector增加這樣的操作其實并不難,但如果使然,那么“讓這些操作具有通用性和可適應性”的努力則會使對其進行優化處理的效果變得微乎其微——而對于嚴格的數學計算而言,通過優化處理以提高效率往往是最重要的。因此,標準程序庫提供了一個名為valarray的vector,它的通用性不夠強,但為面向數字計算的優化留出了很大的余地:
template<class T>class valarray {
// …
T& operator[](size_t);
// …
};
型別size_t是無符號整型(unsigned integer),valarray將其用于數組的下標操作。
valarray能用于一般的算術操作以及一些最常用的數學函數。例如:
template<class T>valarray<T>abs(const valarray<T>&); // 取絕對值的函數
void f(const valarray<double>& a1, const valarray<double>& a2)
{
valarray<double> a = a1 * 3.14 + a2 / a1;
a += a2 * 3.14;
valarray<double> aa = abs(a);
double d = a2[7];
// …
}
valarray型別還支持BLAS-style、generalized slicing。更多復雜的數學型別——比如Matrix——可以基于valarray來構造。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -