这是本文档旧的修订版!
人生苦短,我要面向对象。
Warning:找不到对象
最简单的STL是vector,简单到不能再简单了。
其中vector的insert功能很好地模拟了链表的插入操作,虽然vector的本质是数组。
(但是写一个数组的插入岂不是很繁?人生苦短啊)
例如:
OJ编号263:jhljx又来了。
<hide>
#include<stdio.h> #include<string.h> #include<algorithm> #include<vector> using namespace std; char sorted; char Add[4]="Add"; char Del[4]="Del"; char Sum[4]="Sum"; char op[5]; int tmpint; int n; long long result; int main() { while(~scanf("%d",&n)) { vector<int> a; sorted=1; while(n--) { scanf("%s",op); if(!strcmp(op,Add)) { scanf("%d",&tmpint); a.push_back(tmpint); sorted=0; } else if(!strcmp(op,Del)) { if(!sorted) { sort(a.begin(),a.end()); sorted=1; } scanf("%d",&tmpint); vector<int>::iterator it; for(it=a.begin();it!=a.end();++it) { if(*it==tmpint) { a.erase(it); break; } } } else if(!strcmp(op,Sum)) { result=0; if(!sorted) { sort(a.begin(),a.end()); sorted=1; } int i; for(i=2;i<a.size();i+=5) { result+=(long long)a[i]; } printf("%lld\n",result); } } } }
</hide>
OJ编号266:AZY学习顺序表。
<hide>
#include<stdio.h> #include<string.h> #include<vector> using namespace std; int n,m; int tmpint; char Insert[5]="Ins"; char Delete[5]="Del"; char Locate[5]="Loc"; char Getcha[5]="Get"; char operation[5]; int opA,opB; int main() { while(~scanf("%d%d",&n,&m)) { vector<int> a; int i; for(i=0;i<n;++i) { scanf("%d",&tmpint); a.push_back(tmpint); } while(m--) { scanf("%s",operation); if(!strcmp(operation,Insert)) { scanf("%d%d",&opA,&opB); if(opA>(a.size()+1)||opA<=0) { printf("Wrong input!\n"); } else { a.insert(a.begin()+opA-1,opB); vector<int>::iterator ni; for(ni=a.begin();ni!=a.end();ni++) { printf("%d ",*ni); } printf("\n"); } } else if(!strcmp(operation,Delete)) { scanf("%d",&opA); char mark=0; vector<int>::iterator it; for(it=a.begin();it!=a.end();++it) { if(*it==opA) { mark=1; a.erase(it); vector<int>::iterator ni; for(ni=a.begin();ni!=a.end();ni++) { printf("%d ",*ni); } printf("\n"); break; } } if(!mark) { printf("Wrong input!\n"); } } else if(!strcmp(operation,Locate)) { scanf("%d",&opA); char mark=0; vector<int>::iterator it=a.begin(); for(i=0;it+i!=a.end();++i) { if(*(it+i)==opA) { mark=1; printf("%d\n",++i); break; } } if(!mark) { printf("Wrong input!\n"); } } else if(!strcmp(operation,Getcha)) { scanf("%d",&opA); vector<int>::iterator it=a.begin(); if(opA>a.size()||opA<=0) { printf("Wrong input!\n"); } else { printf("%d\n",*(it+opA-1)); } } } } }
</hide>
OJ编号290:Kevin_Feng写作文。
<hide>
#include<iostream> #include<vector> using namespace std; string add = "Add"; string del = "Del"; string rep = "Rep"; string a; string op; int opA; char opB; int opC; int n, m; int main() { while(cin >> n >> m) { cin >> a; vector<char> b; int i; for(i = 0; i < a.length(); ++i) { b.push_back(a[i]); } while(m--) { cin >> op; if(op == add) { cin >> opA >> opB; b.insert(b.begin()+opA-1, opB); } else if (op == del) { cin >> opA >> opC; while(opC--) { b.erase(b.begin() + opA - 1); } } else { cin >> opA >> opB; b[opA - 1] = opB; } } vector<char>::iterator c; for(c=b.begin();c!=b.end();c++) { cout << *c; } cout << endl; } }
</hide>
看吧,vector的insert功能就是这么方便。一般如果我们需要对一个数组(或者链表)里面执行插入操作,请使用vector来减少代码量。
栈和队列都好写,但是单调队列就不好写了。这时候,我们需要合理运用deque的武器呢。