使用泛型演算法必須包含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的實際型別動態自動分派乙個處理函式。最容易想到的方案,蠻幹法 寫一大堆過載函式.不過這種方法會有很強的依賴性。也提供了一...