泛型演算法 獨立於容器的演算法

2021-06-27 18:05:06 字數 2563 閱讀 7594

一:泛型演算法 簡介

(1)所有標準庫容器都有支援遞增運算子、遞減運算子(++、--、== !=)這四種運算子的迭代器;string 和 vector 提供了更多的運算子(> >= < <=,以及iter+n,iter-n,iter+=n,iter-=n,iter1-iter2)

(2)標準庫並未給每乙個容器都定義成員函式來實現排序、查詢、複製等操作,而是定義了一組泛型演算法(generic algorithm)

(3)迭代器令演算法不依賴於容器

(迭代器的知識請看 : 初始迭代器 iterator)

例如 find()函式流程中,除了比較之外,其它的步驟都可以通過迭代器來實現:利用迭代器的解運算子可以實現元素的訪問(*) ++ 移動到下乙個元素,尾後迭代器可以用來判斷find是否到達給定序列的末尾。

(4)演算法永遠不會執行容器的操作

只會運於與迭代器之上,執行迭代器的操作,演算法僅僅可能改變容器中儲存的元素的值,也可能在容器內移動元素,但是永遠不會直接的新增或者刪除元素。

(5)演算法不檢查寫操作:

fill(vec.begin(),vec.end(),0); 沒有任何問題的,但是fill_n(vec.begin(),10,0)就有危險了,你能否保證vec.size()是否大於10?再如拷貝演算法(copy),此演算法是另乙個向目的位置迭代器指向的輸出序列中的元素,共三個迭代器做引數,也得保證目的陣列足夠的大,否則報錯誤的:

[cpp]view plain

copy

print?

int a1 = ;  

int a2[sizeof(a1)/sizeof(a1[0])]; 

auto ret = copy(begin(a1),end(a1),a2). 

int a1 = ; 

int a2[sizeof(a1)/sizeof(a1[0])];

auto ret = copy(begin(a1),end(a1),a2).

(6)重排容器的演算法unique()[cpp]view plain

copy

print

?words 是乙個字串陣列 

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

auto end_unique = unique(words.begin(),words.end()); 

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

words 是乙個字串陣列

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

auto end_unique = unique(words.begin(),words.end());

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

(7)定製操作很多演算法都會比較輸入序列中的元素,預設情況下這類演算法使用元素型別的 < 或 == 運算子完成比較。標準庫還為這些演算法定義了額外的版本,允許我們提供自己定義的操作來代替預設的運算子。

例如,sort函式的第二個版本,此版本是過載過的,他接受第三個引數,這個引數 名稱叫 謂詞(predicate):sort(words.begin(),words.end(),cmp);cmp是二元謂詞。謂詞分為一元謂詞和二元謂詞,而謂詞是乙個可呼叫的表示式,其返回結果是乙個能用作條件的值,如:

[cpp]view plain

copy

print

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

bool isshorter(const string &s1,const string &s2);   

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

bool isshorter(const string &s1,const string &s2);

二:演算法一般都含有兩個版本的

(1)請看primer 上提供的sort() 、 stable_sort()、partion_sort()、partion_sort_copy() 等排序演算法

(2)請看primer 上提供的lower_bound() 、 uuper_bound()、binary_search()等三個基於二分思想的查詢演算法

實現簡單的**請看 : (二分查詢三種演算法)

C 泛型演算法

標準庫並未給每個容器都定義成員函式來實現這些操作,而是定義了一組泛型演算法,稱他們為演算法是因為他們實現了一些經典演算法的公共介面,如排序和搜尋 稱他們為排序的是因為它們可以用於不同型別的元素和多種容器型別。大多數演算法都定義在標頭檔案algorithm中。標準庫還在標頭檔案numeric中定義了一...

C 泛型演算法

1 泛型演算法初始 標準庫演算法都是對乙個範圍內的元素進行操作 除了少數例外 並將此範圍稱為 輸入範圍 而且總是使用前兩個引數來表示次範圍,這兩個引數分別代表,要處理的首元素和尾元素之後位置的迭代器。1.1 唯讀演算法 只會讀取輸入範圍內的元素,而從不改變元素 find int sum accumu...

C 泛型演算法

1 泛型演算法定義 泛型演算法 因為它們實現共同的操作,所以稱之為 演算法 而 泛型 指的是它們可以操作在多種容器型別上 不但可作用於 vector 或 list 這些標準 庫型別,還可用在內建陣列型別 甚至其他型別的序列上,這些我們將在本章的 後續內容中了解。自定義的容器型別只要與標準庫相容,同樣...