c Primier 第十一章 泛型演算法

2021-10-08 00:23:55 字數 3239 閱讀 7473

使用泛型演算法必須包含algorithm標頭檔案:

#include;

標準庫還定義了一組泛化的算術演算法,使用這些演算法則必須包含numberic標頭檔案

#include

int sum = accumulate(vec.begin(),vec.end(),42);

find_first_of:

size_t cnt;

list::iterator iter = roster1.begin();

while( (iter = find_first_of(iter, roster1.end(),roster2.begin(),roster2.end())) !=roster1.end() )

cout << "found " << cnt << " name on both rosters" << endl;

不檢查寫入操作的演算法

引入back_inserter

back_inserter生成乙個繫結在該容器上的插入迭代器。在試圖通過這個迭代器給元素賦值時,賦值運算將呼叫push_back在容器中新增乙個具有指定值的元素。示例如下:

vectorvec;

fill_n(back_inserter(vec), 10, 0);

實現效果相當於在vec末尾新增10個元素,每個元素的值都是0.

vectorivec;

copy(ilst,begin(), ilst.end(), back_inserter(ivec));

這個例子的效率比較差,更好的方法是直接用輸入範圍作為新構造容器的初始化:

vectorivec(ilst.begin(), ilst.end());

vectorivec;

replace_copy(ilst.begin(), ilst,end(), back_inserter(ivec), 0, 42);

呼叫該函式後,ilst沒有改變,ivec儲存ilst的乙份副本,而ilst內所有的0在ivec中都變成了42.

bool isshorter(const string &s1, const string &2)

bool gt6(const string &s)

int main()

sort(words.begin(), words.end());

vector::iterator end_unique = unique(words.begin(), words.end());

words.erase(end_unique, words.end());

stable_sort(words.begin(), words.end(), isshorter);

vector::size_type wc = count_if(words.begin(), words.end(), gt6);

cout << wc << " " << make_plural(wc, "word", "s") << " b characters or longer" << endl;

return 0;

}

words中的單詞排好序後,呼叫unique返回乙個迭代器,指向超出無重複的元素範圍末端的下一位置,即表示無重複的值範圍的結束。函式isshorter和gt6分別是函式stable_sort和count_if的謂詞。

容器除了普通的迭代器以外,c++還提供了另外三種迭代器:

iostream迭代器(iostream iterator)

反向迭代器(reverse iterator)

呼叫這三個函式都能生成乙個迭代器:

用法示例如下:

listilst, ilst2, ilst3;

//after this loop,ilst contains 3 2 1 0

for(list::size_type i=0;i!=4;++i)

ilst.push_front(i);

//after copy,ilst2 contains 0 1 2 3

copy(ilst.begin(), ilst.end(), front_inserter(ilst2));

//after copy,ilst3 contains 3 2 1 0

copy(ilst.begin(), ilst.end(), inserter(ilst3, ilst3.begin()));

istream_iteratorin;

ostream_iteratorout(strm)

ostream_iteratorout(strm, delim)

示例一

istream_iteratorcin_it(cin);

istream_iteratorend_of_stream;

//使用迭代器範圍初始化ivec

//vectorivec(cin_it, end_of_stream);

while(cin_it != end_of_stream)

for(vector::iterator iter=ivec.begin();iter!=ivec.end();++iter)

cout << *iter << endl;

ostream_iteratorout_iter(cout, "\n");

istream_iteratorcin_it(cin), eof;

while(cin_it != eof)

註解:當綁在流上的迭代器在遇到檔案結束或者某個錯誤時,將等於超出末端迭代器的值。

string:reverse_iterator rcomma = find(line.rbegin(), line.rend(), ',');

cout << string(line.rbegin(), rcomma) << endl;

假設字串line的值為hello,world,則以上程式的輸出為:dlrow.這是因為反向迭代器是逆序從後向前處理string物件。為了得到爭取的輸出,可以採用反向迭代器提供的成員函式base,用法如下:

cout << string(rcomma.base(), line.end()) << endl;

得到正確的輸出:world。

演算法要求的迭代器操作分為五個類別,分別對應如下五中迭代器:

輸出迭代器

前向迭代器

雙向迭代器

隨機訪問迭代器

6. list容器特有的操作

具體用法和含義略。

第十一章 泛型

1 泛型概述 使用泛型可以創造出更靈活的類,定義這種引數化類,可以使內部演算法相同,但資料型別會跟隨型別引數而變。優點 型別安全 指定型別引數後,編譯時會進行型別檢查。效能優化 減少效能消耗,避免裝箱和拆箱操作。重用 避免編寫大量重複的 2 泛型類的使用 2.1 定義泛型類 public class...

第十一章 泛型演算法

1 演算法 find,count 讀演算法,標頭檔案algorithm copy,replace,replace copy 寫演算法,標頭檔案algorithm find first of,accumulate 讀演算法,標頭檔案numeric fill,fill n 寫演算法,標頭檔案xutili...

modern c design 第十一章

本章介紹了經常遇到的雙分派的一種泛型解決方案。c 在語法上實現了單分派,即虛函式,通過動態機制選擇相應的函式。雙分派是形如fun object1 a,object2 b 根據a和b的實際型別動態自動分派乙個處理函式。最容易想到的方案,蠻幹法 寫一大堆過載函式.不過這種方法會有很強的依賴性。也提供了一...