[雜亂筆記]algorithm頭文件下的常用函數

使用algorithm頭文件,需要在頭文件加using namespace std;
1、常見的函數(max(),min(),abs(),swap())

int x=98;
int y=7;
int z=12;
printf("%d %d\n",max(x,y),min(y,z));///求最小值和最大值
swap(x,y);///交換x,y的值

int r=-1printf("%d\n",abs(r));///求數的絕對值

2、reverse()、next_permutation()、fill()、sort()
(1)reverse(it,it2):可以將數組指針在(it,it2)之間的遠足或容器的迭代器在[it,it2)範圍內的元素進行反轉。

///a爲數組
reverse(a,a+4);///反轉a[0]~a[3]的元素

///str爲字符串數組
reverse(str.begin()+1,str.begin()+5);///反轉str[1]~str[4]的元素

(2)next_permutation():給出一個序列在全排列中的下一個序列,按照字典升序的方式生成的排列

int a[10]={1,2,3};
   do{
     printf("%d %d %d\n",a[0],a[1],a[2]);
   }while(next_permutation(a,a+3));
//1 2 3
//1 3 2
//2 1 3
//2 3 1
//3 1 2
//3 2 1

相反地,perv_permutation():按照字典降序的方式生成的排列(運用此函數前,序列要先從大到小排序)

int a[10]={3,2,1};///從大到小排序
    do{
       printf("%d %d %d\n",a[0],a[1],a[2]);
    }while(prev_permutation(a,a+3));

(3)fill():可以把數組或容器中的某一段區間賦爲某個相同的值。和memset不同,這裏的賦值可以是數組類型對應範圍中的任意值。

fill(a,a+3,5);///將a[0]~a[2]均賦值爲5

(4)sort():用來排序的函數
(1)基本數據類型的數組排序

///a爲數組
sort(a,a+4);///默認升序排序
sort(a,a+4,less<數據類型>());///升序排序
sort(a,a+4,greater<數據類型>())///降序排序

(2)自定義cmp函數排序

#include <algorithm>
#include <iostream>
#include<stdio.h>
using namespace std;
bool cmp(int a,int b){
  return a<b;///從小到大,如果是a>b就是從大到小
}
int main()
{
    int a[4]={3,2,1,7};
    sort(a,a+4,cmp);
    for(int i=0;i<4;i++)
       printf("%d\n",a[i]);
    return 0;
}

(3)結構體數組

struct node{
  int x,y;
}arr[10];
bool cmp(node a,node b){
  return a.x>b.x;///x從大到小排序
}

bool cmp(node a,node b){
   if(a.x!=b.x) return a.x>b.x;
   else return a.y<b.y;///當x相等的情況下
}

(4)容器的排序
在STL標準容器中,只有vector、string、deque是可以使用sort,像set、map這種容器用紅黑樹實現的,元素本身有序,故不允許使用sort排序。
例如(vector):

bool cmp(int a,int b){
  return a>b;
}
vector<int>a;
sort(a.begin(),a.end(),cmp);

3、lower_bound和upper_bound()
它們都需要用在一個有序數組或容器中。
lower_bound(first,last,val):用來尋找在數組或容器的[first,last)範圍內第一個值>=val的元素的位置,如果數組,則返回該位置的指針;如果是容器,則返回該位置的迭代器。
upper_bound(first,last,val):用來尋找在數組或容器的[first,last)範圍內第一個值>val的元素的位置,如果數組,則返回該位置的指針;如果是容器,則返回該位置的迭代器。

int a[4]={1,2,3,4};
  int *lowerpos = lower_bound(a+1,a+4,2);///>=1,位置從下標爲1開始
  int *upperpos = upper_bound(a+1,a+4,2);///>1也就是在這個範圍內於元素不存在,返回位置
  printf("%d %d\n",lowerpos-a,upperpos-a);///1(下標),2(位置)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章