• STL初探


    关于STL的一些东西

    感言:

    学C++不学STL函数库的人可能都是。。。

    有点问题


    头文件<algorithm>的一些东西

    sort,快排:

    这是个初学者必需掌握的东西,及其好用,因为方(lan)便(duo)。

    sort(a+1,a+1+n);是最基本的,你还可以根据这个随意改变数组名称,区间范围(只要确定你需要排序数组的开头和结尾的数组的代号)

    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n;
    int main()
    {
        cin>>n;
        int a[n+1];
        for(int i=1;i<=n;i++)
        cin>>a[i];
        sort(a+1,a+1+n);
        for(int i=1;i<=n;i++)
        cout<<a[i];
    }

    next_permutation与prev_permutation,不重复的全排列:

    这玩意貌似没啥人知道,因为全排列可以自己打,而且STL本来就慢,但是因为方(lan)便(duo)还是挺好用的。这里介绍一下,next_permutation是按照字典序排列的全排列而prev_permutation则是逆字典序排列的。要使用这个东西,你必须确定你需要排列数组的值的

    顺序!!!

    例如,你用next_permutation排列(3,1,2)会得出(3,1,2);(3,2,1);

    而用next_permutation排列(1,2,3)会得出(1,2,3);(1,3,2);(2,1,3);(2,3,1);(3,1,2);(3,2,1);

    所以顺序很重要!!!如果你想要得出全部答案一个范围的排序,next_permutation你就从小到大来,prev_permutation你就从大到小来,值得一提的是这玩意返回值是bool类型的,偶买噶!!!;

    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n;
    int main()
    {
        cin>>n;
        int a[n+1];
        for(int i=1;i<=n;i++)
        cin>>a[i];
        do
        {
            for(int i=1;i<=n;i++)
            cout<<a[i]<<" ";
            cout<<endl;
        }
        while(next_permutation(a+1,a+n+1));
    }

     lower_bounde与upper_bound,二分

    这个东西也是稀奇古怪的STL,也是一个比较没用的的STL,毕竟二分可以自己打嘛。不过还是要提一下,lower_bound是在一个区间查找第一个大于等于你所指定数的数,upper_bound则是去掉等于符号->大于你所指定的数。肯定需要给个区间,但最重要的是。。。

    顺序!!!

    是的,一样需要顺序(别以为STL二分就不需要顺序 是不是看起来很棒(fei)。最有毒的是这个玩意返回的是个地址,所以你还得减去个地址,真棒呵。

    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n,k,ans;
    int main()
    {
        cin>>n>>k;
        int a[n+1];
        for(int i=1;i<=n;i++)
        cin>>a[i];
        ans=lower_bound(a+1,a+1+n,k)-a;     //    ans=upper_bound(a+1,a+1+n,k)-a;
        cout<<ans;
    }                                                                                                                                                                                                                                                                                                                        

     unique,去重

    这个东西算是很有效的一种工具了,这个有个很大的缺陷就是它只能“消除”它左右两边的重复数字,原因是它不是“消除”,而是让后面的数字“替代”前面的重复数字,更改他们的位置。所以一般需要排完一遍序才能操作。不得不感叹,STL真的啥都给你做好了。然而这玩意又是返回地址的,真的不能理解,STL咋天天返回地址。我就不减下标了,直接用指针。

    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n,k;
    int main()
    {
        cin>>n;
        int a[n+1];
        for(int i=1;i<=n;i++)
        cin>>a[i];
        k=*unique(a+1,a+1+n);
        cout<<k<<endl;
        for(int i=1;i<=k;i++)
        cout<<a[i]<<" ";
    }

     random_shuffle和reverse

    咳咳,在LYD所著的算法竞赛——进阶指南中提到这两个是相同用法,emmmm我也不知道怎么相同用法,但确实不一样,今天就来提一下,在random_shuffle中的确就是考研人品的时候,真的随机打乱,其他真的不知道,也只能orz一下别的找处规律的大佬。而在reverse中它就是将你输入进去的数翻转一下——比如你开了a[4]的数组,那么储存在编号0的数就换与编号3的地方交换,一一对应,同样他也需要一个区域,跟sort填写方式差不多,上代码:

    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n;
    int main()
    {
        cin>>n;
        int a[n+1];
        for(int i=1;i<=n;i++)
        cin>>a[i];
        reverse(a+1,a+1+n);         //random_shuffle(a+1,a+1+n);
        for(int i=1;i<=n;i++)
        cout<<a[i]<<" ";
    }

     不知不觉,algorithm(STL算法)就结束了,这只是浩大的STL中微不足道(好像还挺重要的)的一个头文件,前进吧,骚年们,向着伟大的STL容器出发。


    关于头文件<vector>的一些东西

    vector:

    我们要讲的vector,你可以把它理解成一个给你开好了的“一维自动变长合理规划空间支持随机访问的数组”(呼~呼~呼~~)

    一些板栗:

    vector<int>a ------这是一个一维“int”类型的数组

    vector<int> a[1001]---------这是一个一维开了编号0~1000,二维自动变长的数组

    sturct blablabla vector<blablabla> a//a[1001]--------同样支持结构体哟

    一些板栗的正确吃法:

    size和empty:

    这个很好理解的吧,size表大小,就是vector到底有多长。empty表空。。。(理屈词穷),就是你懂得,返回的是一个bool类型的,表是否为空,空即为1,不空即为0.


    持续更新中!!!

  • 相关阅读:
    Codeforces Round #452 F. Letters Removing
    bzoj 1492: [NOI2007]货币兑换Cash
    bzoj 4016: [FJOI2014]最短路径树问题
    bzoj 2109: [Noi2010]Plane 航空管制
    bzoj 1058: [ZJOI2007]报表统计
    bzoj 1016: [JSOI2008]最小生成树计数
    bzoj 1013: [JSOI2008]球形空间产生器sphere
    bzoj 1758: [Wc2010]重建计划
    bzoj 2337: [HNOI2011]XOR和路径
    一本通1668取石子
  • 原文地址:https://www.cnblogs.com/YYCether666/p/11372984.html
Copyright © 2020-2023  润新知