今天下午大體學完了進階指南中algorithm頭文件下的內容,在這裏進行一個總結。node
reverse翻轉c++
顧名思義,reverse進行的操做就是翻轉原來的順序,理解很是簡單,故不贅述。算法
操做樣例:
數組
#include<bits/stdc++.h> using namespace std; vector<int>a; int b[233]; int main() { int na,nb;
//vector的實現 scanf("%d",&na); for(int i=0;i<na;i++) { int x; scanf("%d",&x); a.push_back(x); } reverse(a.begin(),a.end()); for(int i=0;i<na;i++) printf("%d ",a[i]); cout<<endl;
//數組下的實現 scanf("%d",&nb); for(int i=1;i<=nb;i++) scanf("%d",&b[i]); reverse(b+1,b+1+nb); for(int i=1;i<=nb;i++) printf("%d ",b[i]); return 0; }
unique去重dom
unique的含義仍然很好理解ovo,我也不說太多了,函數返回值能夠是去重後的元素個數,好比:函數
int m=unique(a.begin(),a.end())-a.begin();測試
int n=unique(b+1,b+1+len)-b-1;spa
操做樣例:code
#include<bits/stdc++.h> using namespace std; vector<int>a; int b[233]; int na,nb; int main( ) { scanf("%d",&na); for(int i=0;i<na;i++) { int x; scanf("%d",&x); a.push_back(x); } int ma=unique(a.begin(),a.end())-a.begin(); for(int i=0;i<ma;i++) printf("%d ",a[i]); cout<<endl; scanf("%d",&nb); for(int i=1;i<=nb;i++) scanf("%d",&b[i]); int mb=unique(b+1,b+1+nb)-b-1; for(int i=1;i<=mb;i++) printf("%d ",b[i]); return 0; }
random_shuffle隨機打亂blog
用法和reverse相同,我都懶得寫代碼了...
sort快速排序
想必sort的通常用法你們都很熟悉了,再也不贅述,但vector<struct>我之前倒沒有接觸過。
我看網上有不少博客介紹,但彷佛都不太清晰,因此本身摸索出了一種比較麻煩佔空間但簡單易懂的方法,但願dalao指點。
操做實例:
#include<bits/stdc++.h> using namespace std; struct node { int x,y; }; node b[233]; vector<node>a; bool operator <(const node &a,const node &b) { return a.x<b.x; } int main() { int n; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d%d",&b[i].x,&b[i].y); a.push_back(b[i]); } sort(a.begin(),a.end()); for(int i=0;i<a.size();i++) printf("%d %d\n",a[i].x,a[i].y); return 0; }
permutation全排列
組合數學你們必定多多少少都有所瞭解,全排列指的就是A(n,n)式的全部排列方法,也就是說五選五。
next_permutation()會取得[first,last)所標示之序列的下一個排列組合;
利用next_permutation的返回值,判斷是否全排列結束 若是沒有下一個排列組合,便返回false;
不然返true; STL提供了兩個用來計算排列組合關係的算法; 分別是next_permutation和prev_permutation;
下一個全排列(next_Permutation) 前一個全排列(prev_permutation)
簡單來講
next_permutation
按照字典序由小到大的全排列
prev_permutation
按照字典序由大到小的全排列
兩者返回值爲true/false 用來判斷是否還有下一個排列 全排列的輸出正常的for循環便可
注:二者爲互逆運算
#include<bits/stdc++.h> using namespace std; int a[25],b[25]; int main() { int n1,n2; cout<<"對next_permutation的操做\n"; cin>>n1; for(int i=1;i<=n1;i++) cin>>a[i];//輸入數據應該是一組數據全排列中字典序不爲最大的一類 do { for(int i=1;i<=n1;i++) cout<<a[i]<<" "; cout<<endl; }while(next_permutation(a+1,a+1+n1)); cout<<endl; cout<<"對prev_permutation的操做\n"; cin>>n2; for(int i=1;i<=n2;i++) cin>>b[i];//輸入數據應該是一組數據全排列中字典序不爲最小的一類 do { for(int i=1;i<=n2;i++) cout<<b[i]<<" "; cout<<endl; }while(prev_permutation(b+1,b+1+n2)); return 0; }
lower_bound與upper_bound
l_b的做用是在一個區間內尋找第一個大於等於x的元素的位置,u_b是查找
第一個大於x的元素的位置,返回值就是其位置。
固然還有其餘操做,好比它有一個很重要的做用就是和unique函數配套使用進行離散化,後續我會在STL的總結中具體解釋。
#include<bits/stdc++.h> using namespace std; vector<int>a; int b[233]; int na,nb,xa,xb; int main() { scanf("%d%d",&na,&xa); for(int i=0;i<na;i++) { int x; scanf("%d",&x); a.push_back(x); } printf("%d\n",lower_bound(a.begin(),a.end(),xa)-a.begin()); scanf("%d%d",&nb,&xb); for(int i=1;i<=nb;i++) { scanf("%d",&b[i]); } printf("%d\n",upper_bound(b+1,b+1+nb,xb)-b); return 0; }
個人總結主要以代碼爲主,algorithm下的函數都簡單易懂,沒有用太多的文字說明,都是本身手打測試的操做實例,多測試幾組數據,天然就明白了。
若是有不對的地方,但願dalao指正。>w<