algorithm頭文件的一些常用函數


首先當然要包含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 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM