五、泛型算法(二)

本節(jié)主要分8個(gè)部分介紹一些常用泛型算法。
下列函數(shù)的參數(shù)列表中:
1)b、m和e是表示元素范圍的迭代器。
2)b2是表示第二個(gè)序列開始位置的迭代器。e2表示第二個(gè)序列的末尾位置。如果沒有e2,則假定b2指向的序列與b和e表示的序列一樣大。
3)d是表示目的序列的迭代器。注意,算法需要向目的序列寫入多少元素,目的序列必須保證能保存同樣多的元素。通常,d可以與b相同,表示直接在原序列上進(jìn)行修改。
4)val、val1、val2是一些要進(jìn)行比較的值。
5){a,b,c,...}是初始值列表,列表內(nèi)元素不限個(gè)數(shù)。
6)p1和p2分別表示一元和二元謂詞,分別接受一個(gè)和兩個(gè)參數(shù)。

§I?只讀算法
※ equal函數(shù)在結(jié)合反向迭代器后可用于判斷一個(gè)字符串是否是回文字符串,代碼如下:
§II?寫算法
????注意,寫算法無(wú)法改變底層容器的大小。
?對(duì)于remove(移除)和unique(去重)系列函數(shù),其中的“刪除”操作并未真正刪除元素(即不改變?nèi)萜鞔笮。盒退惴ǖ奶攸c(diǎn)),只是用要保留的元素覆蓋了要?jiǎng)h除的元素,最終使要保留的元素留在序列前端。
為了刪除元素,可以在remove或unique的基礎(chǔ)上結(jié)合容器的erase方法,實(shí)現(xiàn)刪除元素(且改變?nèi)萜鞔笮。┑男Ч?/span>例如:
※ 注:unique函數(shù)只會(huì)對(duì)相鄰的重復(fù)元素去重,若想對(duì)整個(gè)序列去重則需要先將序列排序。
§III?排序與劃分算法
排序算法(默認(rèn)升序)
partial_sort和nth_element都是未完成的快排。
劃分算法
§IV?有序序列上的泛型算法(使用前要確保序列有序)
二分查找
集合算法
注:定義目的序列時(shí)需要先指定其容器大小。例如:
序列合并算法
inplace_merge用于一個(gè)序列中包含兩段有序序列的情況,但實(shí)際情況中是需要預(yù)先找到兩序列分界處的位置的,例如:
* §V 堆操作算法
§VI?排列算法
§VII?最大最小值算法
§VIII?數(shù)值算法
※ list容器特有的算法
注意,因list容器底層的數(shù)據(jù)結(jié)構(gòu)是雙向鏈表,故使用其成員函數(shù)版本的算法比使用通用泛型算法更好(因?yàn)榉盒退惴ń粨Qlist的元素時(shí)代價(jià)太高)。下列常用list成員函數(shù)版本的算法:
因?yàn)榇颂幍膔emove和unique本身就是list的成員函數(shù),所以刪除時(shí)會(huì)直接從容器中刪除并改變?nèi)萜鞔笮 #ㄗ⒁馀c泛型算法中的remove和unique區(qū)別)