(七)其他庫
c++還提供了其他一些類庫,比如頭文件<complex>為復數(shù)運算提供了類模板complex,包含用于float,long,long double的具體化,這個類庫提供了標準的復數(shù)運算和能夠處理復數(shù)的函數(shù);頭文件<random>提供了許多新的隨機數(shù)的功能。
1.vector,valarray和array
vector類是一個容器類和算法系統(tǒng)的一部分,屬于STL,支持面向容器的操作,如排序sort(),插入insert(),重新排列random_shuffle(),搜索find(),將數(shù)據(jù)轉移到其他容器swap()等;
valarray類不屬于STL,它是面向數(shù)值計算的,因此很多數(shù)學運算符都經(jīng)過了重載,可以使用數(shù)乘,加法等操作。Valarray類對象可以直接整體進行運算,這樣就是對其中的每一個元素進行相應的運算,對于數(shù)值計算來說,這是非常方便的。valarray類還提供了sum(),max(),min(),size()等方法,方便數(shù)據(jù)的處理;除了這些,valarray還有一些其他特性,其中一個就是slice用作下標的類,slice對象通過3個參數(shù)來構造,比如slice(1,4,3),表示有4個元素,起始為1,跨距是3,也就是值為1,4,7,10的所有的下標,因此如果vector aa;那么aa[slice(1,4,3)]就表示下標為1,4,7,10的所有的元素。slice用作數(shù)組索引,表示的不是一個值,而是一組值。
array是為了替代內置數(shù)組而設計的,通過提供更好更安全的接口,讓數(shù)組更緊湊,效率更高,array類盡管不是STL的一部分(比如不支持push_back操作),但是它支持很多STL方法(包括begin(),end()等),因此可以使用STL算法對array類進行操作。
2.模板initializer_list
模板initializer_list是c++11新加的功能,也就是將初始化列表作為參數(shù)來構建對象,使得這種大括號形式的初始化可以應用于各個方面。
初始化列表,要使用initializer_list對象,需要包含頭文件initializer_list。initializer_list本身就是一個類模板,{2,3,5.6}就是一個initializer_list對象,可以使用begin,end等來表示起始元素和超尾元素的位置。也可以像使用普通對象那樣來使用initializer_list對象。
很多容器類支持列表初始化語法,主要是因為這些容器類有一個使用initializer_list作為構造參數(shù)的構造函數(shù),比如vector aa{22,34.2};之所以可行,是因為vector模板類有一個相應的構造函數(shù),上述代碼與下面的代碼等價vector aa({22,34.2});initializer_list表示的就是大括號包含的內容。列表初始化語法有一個特點,就是可以進行隱式的拓寬轉換,比如int型轉換為double型,但是不能進行窄化轉換,比如不能將double自動轉換為int型。除非類要處理不同長度的數(shù)據(jù)序列,否則沒有必要創(chuàng)建一個以初始化列表作為參數(shù)的構造函數(shù)。
3.總結
有些算法可以表示為容器類算法,但是大部分算法都被表示為通用的,非成員的函數(shù),這是通過將迭代器作為容器和算法之間的接口而實現(xiàn)的。
STL還提供了函數(shù)對象(函數(shù)符),函數(shù)對象是重載了()運算符的類生成的對象。自適應函數(shù)符有typedef語句,這些語句表示了函數(shù)符的返回類型和參數(shù)類型。
STL提供了非常有用的可重用代碼源,可以直接使用STL來解決編程問題,也可以將他們作為基本部件,來構建所需的解決方案。