先来说一下开学以来的感受吧,开学以后看到老师发的课件,我眼里看到的是新的内容,上一个星期天才开始学习课件的内容,从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只刷了几个题,在以后的时间里,每学完一个章节,就要对知识运用好,多看题,多去梳理难题的解题思路。