zoukankan      html  css  js  c++  java
  • C++ #include<algorithm>

      今天下午大致学完了进阶指南中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
    ",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的操作
    "; 
        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的操作
    "; 
        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
    ",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
    ",upper_bound(b+1,b+1+nb,xb)-b);
        return 0;
    }

    我的总结主要以代码为主,algorithm下的函数都简单易懂,没有用太多的文字说明,都是自己手打测试的操作实例,多测试几组数据,自然就明白了。

    如果有不对的地方,希望dalao指正。>w<

  • 相关阅读:
    视频学习网站
    保存文章
    maven常见命令总结
    Eclipse vs IDEA快捷键对比大全(win系统)
    JS调用android逻辑方法
    【原创】不用封装jar包 直接引入工程使用的方法(类似android的 is Library功能)
    windows下eclipse+hadoop2
    Solaris用户管理(一):用户与组管理
    jquery 操作 checkbox
    模拟用户登录的操作
  • 原文地址:https://www.cnblogs.com/valentino/p/11141123.html
Copyright © 2011-2022 走看看