(六)算法
STL包含了許多處理容器的非成員函數(shù),它們都使用迭代器來標(biāo)識要處理的數(shù)據(jù)區(qū)間和結(jié)果存放的位置,有些函數(shù)還接受一個(gè)函數(shù)對象參數(shù),用它來處理數(shù)據(jù)。常見的算法有copy,sort,random_shuffle,find等。算法函數(shù)的特點(diǎn)是可以用于不同的容器類型,算法的適應(yīng)性強(qiáng),原因就是使用了迭代器(舉例來說deque和vector中的元素是可以用==來進(jìn)行比較的,因?yàn)?=被重載了,它使用的是迭代器來進(jìn)行比較)。
1.算法組
分為四種:非修改式序列操作(find()和for_each()就屬于這一類),修改式序列操作(transform(),random_shuffle(),copy()屬于這一類,可以對原來的數(shù)據(jù)進(jìn)行修改),排序和相關(guān)操作(如sort()函數(shù)),通用數(shù)字運(yùn)算。前三種在頭文件algorithm中描述,最后一種在numeric中描述,最后一種是專用于數(shù)值數(shù)據(jù)的(比如數(shù)據(jù)累積,相鄰數(shù)據(jù)差等的操作,一般vector對象可以用到)。
2.算法的通用特征
按算法的結(jié)果放置的位置進(jìn)行的分類,分為就地算法和復(fù)制算法,sort()就是就地算法,因?yàn)榕判虻慕Y(jié)果依然存在原來的對象之中,而copy()就是復(fù)制算法,結(jié)果被轉(zhuǎn)移到輸出迭代器之中。對于復(fù)制算法,有一個(gè)一般的約定,就是返回一個(gè)輸出迭代器,這個(gè)迭代器指向復(fù)制的最后一個(gè)值的后面一個(gè)位置。有些算法有兩個(gè)版本,就地版本和復(fù)制版本,復(fù)制版本一般是在后面加一個(gè)_copy后綴,用來與就地版本進(jìn)行區(qū)分,copy版本會多一個(gè)參數(shù),就是將結(jié)果存儲的新的位置。
3.STL和string類
string類不屬于STL,但是string類有STL的諸多特點(diǎn),設(shè)計(jì)時(shí)就考慮了STL。比如,string類包含begin,end,rbegin,rend等成員。因此string類可以使用STL算法來進(jìn)行相應(yīng)的操作。string類中有一個(gè)方法,用來將string對象轉(zhuǎn)換為下一種排列順序,如果是最后的序列,則返回false,方法為next_permutation()。
4.函數(shù)和容器方法
有時(shí)候可以選擇使用STL方法和STL函數(shù),這里的方法指的是成員函數(shù),通常STL方法是更好的選擇,因?yàn)樗梢宰詣诱{(diào)整容器的大小,并且會更適合特定的容器。
5.使用STL
使用STL時(shí)要盡量減少編寫的代碼。需要注意的幾點(diǎn):首先,非關(guān)聯(lián)容器map類有一個(gè)有趣的特性,就是可以使用鍵來訪問數(shù)據(jù),因?yàn)殒I和值的類型不一樣,所以可以使用map1[“the”]這種表示方法(如同數(shù)組表示法)來訪問map的值。