寫了乙個upper_bound的實現。其中遞迴使用二分法求解最上界,雖然寫的完全不像stl的風格,但是練手還是可以的。
#include#include#include#includeusing namespace std; int upperbound(int* a, int start, int end , const int& value) else if(a[mid]如果原陣列中沒有存在那個元素,就根本沒有呼叫那個遞迴程式,遞迴只有在出現多個此元素時才會呼叫。另外中間遞迴呼叫段地方還可以改寫為:
if(a[mid] == value)
這樣寫完後寫一下測試**,順便wrap一層upper_bound:
int upper_bound(int * a,int n, const int& value) int * tmp_a = new int[n]; memcpy(tmp_a,a,sizeof(int)*n); #endif int index = upperbound(a,0,n-1,value); #ifdef test // post-condition //check whether the array is changed or not for(int i = 0; i < n; i++) assert(a[i] == tmp_a[i]); if(index == 0) else if(index == n) else delete tmp_a; #endif return index; }
如果希望別人不呼叫upperbound而只呼叫upper_bound,可以使用static 關鍵字, 將upperbound限制在只在本檔案中使用。別人呼叫就只能呼叫upper_bound()函式。不過stl的教學原始碼比我這精簡的多,根本無須使用遞迴。真正的stl原始碼變數名稱會使用下劃線__作為起始。
template forwarditerator upper_bound ( forwarditerator first, forwarditerator last, const t& value ) else count=step; } return first; }
這裡的advance()函式定義類似:
templatevoid advance(iterator& i, distance n); 類似於 i = x.begin()+n; i is an iterator of x
最後把主函式貼上做結:
int main(int argc, char* argv) ; vectorv(x,x+9); sort(v.begin(),v.end()); cout << (int)(upper_bound(v.begin(),v.end(),9)-v.begin()); cout << upper_bound(x,9,9); return 0; }
stl upper bound函式實現
寫了乙個upper bound的實現。其中遞迴使用二分法求解最上界,雖然寫的完全不像stl的風格,但是練手還是可以的。如果原陣列中沒有存在那個元素,就根本沒有呼叫那個遞迴程式,遞迴只有在出現多個此元素時才會呼叫。另外中間遞迴呼叫段地方還可以改寫為 這樣寫完後寫一下測試 順便wrap一層upper b...
函式基礎 匿名函式,函式,箭頭函式,立即執行函式
doctype html html lang en head meta charset utf 8 meta name viewport content width device width,initial scale 1.0 title document title head body body ...
函式 常見函式
def fib n if n 1 return 1if n 2 return 1return fib n 1 fib n 2 def hannuo n,a,b,c n 表示有n個盤子 a 代表第乙個塔,開始的塔 b 代表第二個塔,過渡塔 c 代表第三個塔,目標塔 d.在 中n 2,這個分支可以不要,...