C++ #include


  今天下午大致學完了進階指南中algorithm頭文件下的內容,在這里進行一個總結。

  reverse翻轉

  顧名思義,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去重


unique的含義仍然很好理解ovo,我也不說太多了,函數返回值可以是去重后的元素個數,比如:

int m=unique(a.begin(),a.end())-a.begin();

int n=unique(b+1,b+1+len)-b-1;

操作樣例:

#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隨機打亂

用法和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<

 


免責聲明!

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



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