STL简单应用

先来说一下开学以来的感受吧,开学以后看到老师发的课件,我眼里看到的是新的内容,上一个星期天才开始学习课件的内容,从STL开始学,直到这个星期才看完这个课件,感觉这就是我对门课的学习(慢慢来),到那时我还没意识到我是多无知,我以为老师发的内容,我看不懂别人大部分也看不懂,直到昨天我有机会看别的同学发的博客,那时候我才明白我真的是愚蠢之至,其他同学依然是已然学习了大部分内容,而我开学之前的学习只停留在暴力枚举,后面的其他算法根本没有涉及,我不禁在想这一个假期我到底干了些啥,一刹那想起老师开第一节课说的话,我才知道我在假期的状态,只是活在自己的世界里根本不知道别的同学有多努力。为此写博客成为我最苦恼的事情,看到别人写的博客,我不禁问自己你的博客如何写?到现在已然是没有办法改变寒假了,那我就把握以后的时间,拿出多的时间去学习这门课的内容,起码到最后达到合格的状态,能顺利完成这门课,这样也符合我一开始选这门课的初衷——学点知识。

争取下一个星期写博客时能写解题思路。

进入正题吧,说一说我这个星期到底学了啥新知识。

一、STL

(一)string

(1)string a("I am")

string s("I am");                                  
cout<<s[0]<<endl;//I
cout<<s[1]<<endl;//(空格)
cout<<s[2]<<endl;//a
cout<<s[3]<<endl;//m   

(2)比较string对象

比如ABC与ABCD比较,第一个字符相同,继续比较第二个字符,由于第二个字符是第二个串大,所以不再继续比较,结果就是后面的串大。所以,长度不能直接决定大小,字符串的大小是由左边开始前面不同字符决定的。

(二)栈(stack:先进后出)

stack<int>s;
s.push(1);
s.push(2);
s.push(3);
cout<<"Top:"<<s.top();//Top:3
s.pop();                
cout<<"Top:"<<s.top();//Top:2                  

(三)队列(queue:先进先出)

queue<int>s;
s.push(1);
s.push(2);
s.push(3);
s.pop();
cout<<"Front:"<<s.front; //Front:2

(四)sort

以前一直以为sort仅仅只能升序,现在也可以让它降序了;

int a[]={1,3,5,2,0};
(1)bool cmp(int a,int b){
          return a>b;}
(2)sort(a,a+5,cmp);//a[]={5,3,2,1,0};
       

(五)去重unique

返回值为指向最后一个元素的下一个元素的迭代器。

(&a[2]-&a[0]==2)

二、

(一)随机数

#include<bits/stdc++.h>
using namespace std;
typedf struck index{
      int a,b;
}index;
bool cmp(index a,index b){
     if(a.a>b.a)
     return 1;
     else if(a.a==b.a&&a.b>b.b)
     return 1;
    return 0;}
int main(){
     int n;
     cin>>n;
     index c[1000];
     srand(time(0));
     for(int i=1;i<=n;i++){
        c[i].a=rand()%10;//一位数的随机数//rand()%100//两位数随机数
        c[i].b=rand()%10;
}
    sort(c+1,c+1+n,cmp);
    for(int i=1;i<=n;i++)
    cout<<c[i].a<<" "<<c[i].b<<endl;
return 0;}    
     
    

(二)洛谷(P1093 [NOIP2007 普及组] 奖学金)

这道题当时写起来可费劲了,那时候只学了冒泡、插入、选择、快速和sort排序,对结构体和sort结合用不懂,看我第一次写的代码真的又难懂又长,一开始我先把总成绩分别赋予到两个数组里,然后对其中一个数组(a[])进行降序处理,第一层循环让第二层循环进行i++的操作,实现去重,再在另一个数组(b[])里找与a[i]相等的数,先输出总成绩高且就一个的输出,再用选择排序对语文成绩降序,思路和上面一样,最后再对他们的序号排序,重复上面操作,最后设置输出条件只输出五个。

#include<iostream>
using namespace std;
int s[500][6],n,i,j,b[500],a[500],l,g,m,k,r,e[500];
int main(){
    cin>>n;
    for(i=1;i<=n;i++){
        cin>>s[i][1]>>s[i][2]>>s[i][3];
        s[i][0]=i;
        b[i]=a[i]=s[i][1]+s[i][2]+s[i][3];
        //b[i]=s[i][1]+s[i][2]+s[i][3];
        }
    for(i=1;i<=n;i++)
        for(j=i+1;j<=n;j++)
        if(a[i]<a[j]) swap(a[i],a[j]);
    for(i=1;i<=n;i++){
            int c=1,d=0;
        for(j=i+1;j<=n;j++){
            if(a[i]==a[j]) i++,c++;//去重
            else break;
        }
        for(j=1;j<=n;j++)
            if(b[j]==a[i]) r=j;
        if(c==1) cout<<r<<" "<<a[i]<<endl,g++;
        else{ for(j=1;j<=n;j++){
            if(d==c) break;
            if(b[j]==a[i]) e[d++]=j;
        }
     for(j=0;j<d-1;j++)
        for(l=j+1;l<d;l++)
           if(s[e[j]][1]<s[e[l]][1]) swap(s[e[j]][1],s[e[l]][1]),swap(e[j],e[l]);
    for(j=0;j<d;j++){
        int x=1,y=0;
        for(l=j+1;l<d;l++){
            if(s[e[j]][1]==s[e[l]][1]) j++,x++;
            else break;
        }
        if(x==1) cout<<s[e[j]][0]<<" "<<a[i]<<endl,g++;
   else{ for(k=j-x+1;k<j;k++)
        for(m=k+1;m<j+1;m++)
        if(e[k]>e[m]) swap(e[k],e[m]);
    for(k=0;k<x;k++)
        cout<<e[k]<<" "<<a[i]<<endl,g++;
    }}}
    if(g==5) break;}
    return 0;
}

了解结构体和sort结合后,这代码真是好写

#include<bits/stdc++.h>
using namespace std;
typedef struct index{
      int a,b,c,d,e;
}index;
bool cmp(index a,index b){
    if(a.e>b.e) return 1;
    else
        if(a.e==b.e&&a.b>b.b) return 1;
    else
        if(a.b==b.b&&a.a<b.a) return 1;
    return 0;
}
int main(){
    index f[380];
    int n;
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;i++)
        f[i].a=i,cin>>f[i].b>>f[i].c>>f[i].d,f[i].e=f[i].b+f[i].c+f[i].d;
    sort(f+1,f+1+n,cmp);
    for(int i=1;i<=5;i++)
        cout<<f[i].a<<" "<<f[i].e<<endl;
    return 0;
}

(三)洛谷(P3156 【深基15.例1】询问学号)vector的应用

思路:将每个同学的学号按照先来后到的顺序,压入可变数组a中,再根据给出的顺序序号,输出学号。

#include<iostream>
#include<vector>
using namespace std;
int main(){
    int n,m,tmp;
    vector<int> a;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>tmp;
        a.push_back(tmp);
    }
    for(int i=1;i<=m;i++){
        cin>>tmp;
        cout<<a[tmp-1]<<endl;
    }
    return 0;
}

总结:STL不仅要会知识点,我感觉最重要的是会用,我STL只刷了几个题,在以后的时间里,每学完一个章节,就要对知识运用好,多看题,多去梳理难题的解题思路。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值