第十六章 string類和標準模板庫(7)其他庫

(七)其他庫

c++還提供了其他一些類庫,比如頭文件<complex>複數運算提供了類模板complex,包含用於float,long,long double的具體化,這個類庫提供了標準的複數運算和能夠處理複數的函數;頭文件<random>提供了許多新的隨機數的功能。

1.vector,valarray和array

vector類是一個容器類和算法系統的一部分,屬於STL,支持面向容器的操作,如排序sort(),插入insert(),重新排列random_shuffle(),搜索find(),將數據轉移到其他容器swap()等;

valarray類不屬於STL,它是面向數值計算的,因此很多數學運算符都經過了重載,可以使用數乘,加法等操作。Valarray類對象可以直接整體進行運算,這樣就是對其中的每一個元素進行相應的運算,對於數值計算來說,這是非常方便的。valarray類還提供了sum(),max(),min(),size()等方法,方便數據的處理;除了這些,valarray還有一些其他特性,其中一個就是slice用作下標的類,slice對象通過3個參數來構造,比如slice(1,4,3),表示有4個元素,起始爲1,跨距是3,也就是值爲1,4,7,10的所有的下標,因此如果vector aa;那麼aa[slice(1,4,3)]就表示下標爲1,4,7,10的所有的元素。slice用作數組索引,表示的不是一個值,而是一組值。

array是爲了替代內置數組而設計的,通過提供更好更安全的接口,讓數組更緊湊,效率更高,array類儘管不是STL的一部分(比如不支持push_back操作),但是它支持很多STL方法(包括begin(),end()等),因此可以使用STL算法對array類進行操作。

2.模板initializer_list

模板initializer_list是c++11新加的功能,也就是將初始化列表作爲參數來構建對象,使得這種大括號形式的初始化可以應用於各個方面。

初始化列表,要使用initializer_list對象,需要包含頭文件initializer_list。initializer_list本身就是一個類模板,{2,3,5.6}就是一個initializer_list對象,可以使用begin,end等來表示起始元素和超尾元素的位置。也可以像使用普通對象那樣來使用initializer_list對象。

很多容器類支持列表初始化語法,主要是因爲這些容器類有一個使用initializer_list作爲構造參數的構造函數,比如vector aa{22,34.2};之所以可行,是因爲vector模板類有一個相應的構造函數,上述代碼與下面的代碼等價vector aa({22,34.2});initializer_list表示的就是大括號包含的內容。列表初始化語法有一個特點,就是可以進行隱式的拓寬轉換,比如int型轉換爲double型,但是不能進行窄化轉換,比如不能將double自動轉換爲int型。除非類要處理不同長度的數據序列,否則沒有必要創建一個以初始化列表作爲參數的構造函數。

3.總結

有些算法可以表示爲容器類算法,但是大部分算法都被表示爲通用的,非成員的函數,這是通過將迭代器作爲容器和算法之間的接口而實現的

STL還提供了函數對象(函數符),函數對象是重載了()運算符的類生成的對象。自適應函數符有typedef語句,這些語句表示了函數符的返回類型和參數類型。

STL提供了非常有用的可重用代碼源,可以直接使用STL來解決編程問題,也可以將他們作爲基本部件,來構建所需的解決方案。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章