algorithm標頭檔案的一些常用函式
阿新 • • 發佈:2019-01-11
首先當然要包含algorithm標頭檔案 :#include <algorithm>
- max(x,y) min(x,y) 引數可以是浮點數
- abs(x) x必須是整數 如果x是浮點數則要用math標頭檔案下的fabs(x)
- swap(x,y) 交換x和y
- reverse(it,it2) it和it2可以是陣列指標,也可以是容器的迭代器 注意的是翻轉範圍為:[it,it2)
- next_permutation() 給出一個序列在全排列中的下一個序列
1 int box[3]={1,2,3}; 2 do{ 3 for(int i=0;i<3;++i) 4 cout << box[i] << ' '; 5 cout << endl; 6 }while(next_permutation(box,box+3));
- fill() 與memset不同,fill賦值可以是陣列型別對應範圍中的任意值,因為string.h標頭檔案中的memset中是按位元組來賦值,因此往往只能賦值0或者-1而且速度比fill速度快
1 1 int box[5]; 2 2 fill(box,box+5,123); 3 3 for(int i=0;i<5;++i)4 4 cout << box[i] << ' '; 5 5 cout << endl;
- lower_bound(first,last,value)、upper_bound(first,last,value),他們都要在一個有序陣列或有序容器中使用,lower_bound在[first,last)中找第一個值大於等於value的元素的位置,upper_bound在[first,last)中找第一個值大於value的元素的位置,所以返回的是陣列的指標或者是容器的迭代器,當然只要減去了首地址得到的也就是目標元素的下標了。 時間複雜度均為:$O(log(last-first))$
- sort() sort根據具體情況會使用不同的排序方法,而且規避了傳統快速排序中可能會出現的複雜度退化到$O(N^2)$的情況(那就跟氣泡排序差不多了,效率差)。
- sort(首元素地址(必填),尾元素地址的下一個地址(必填),比較函式(非必填)) 例如sort(v.begin(),v.end())
- 只有vector、string、deque是可以使用sort,因為set、map這種容器是用紅黑樹實現的,他們本身就是有序的了
- 如果比較的物件是基本資料型別,那麼比較函式可以預設不填(預設是遞增順序,如果我們要改變為遞減也是要重寫比較函式的),但如果物件是結構體,那麼必須由我們來寫一個比較函數出來作為排序依據:
1 bool cmp(int a,int b) //改寫為按遞減順序來排序 2 { 3 return a > b; 4 } 5 6 struct node 7 { 8 int x; 9 int y; 10 }; 11 12 bool cmp(node a,node b) // 結構體的比較函式 13 { 14 if(a.x!=b.x) 15 { 16 return a.x > b.x; 17 } 18 else 19 { 20 return a.y < b.y; 21 } 22 }