顺序式容器:
关于vector的简单用法:
头文件:<vector>
1.vector动态数组,从末尾能快速插入与删除,直接访问任何元素。
2.vector能用来存放任何类型的对象:
Int:vector<int>a;//默认初始值,a为空
vector<int>b(a);//用a定义b
vector<int>a(100);//有100个值为0的元素
vector<int>a(100,6);// 有100个值为6的元素
String:vector<string>a(100,”hello”);//100个值为hello的元素
vector<string>b(a.begin,a.end);//b是a的复制
Struct:struct point{int x;int y;}; vector<struct>a;//用a来存坐标
3.vector的常用操作:
赋值:a.push_back(100);//在尾部添加元素100
a.insert(a.end(),10,5);//在尾部插入10个值为5的元素
元素个数:int size=a.size();
删除:a.pop_back();//删除末尾元素
a.erase(a.begin()+2);//删除第三个元素
a.erase(a.begin()+i,a.begin()+j);//删除区间[i,j-1]的元素
打印:cout<<a[0]<<endl;
排序:sort(a.begin(),a.end());//默认从小到大
清空:a.clear();
a.back();//返回末尾元素
4.例题:
代码:
#include<bits/stdc++.h>
#include<vector>
using namespace std;
int main()
{
vector<int>table;//模拟圆桌
int n,m;
while(cin>>n>>m)
{
table.clear();
for(int i=0;i<2*n;i++) table.push_back(i);//初始化
int pos=0;//记录当前位置
for(int i=0;i<n;i++)//赶走n个人
{
pos=(pos+m-1)%table.size();//圆桌是一个环,取余处理
table.erase(table.begin()+pos);//赶走坏人,table的数量也相应动态减少
}
int j=0;
for(int i=0;i<2*n;i++)
{
if(i%50==0&&i!=0) cout<<endl;//五十一行
if(j<table.size()&&i==table[j])//留下来的都是好人
{
j++;
cout<<"G";
}
else cout<<"B";
}
cout<<endl;
}
return 0;
}
关于stack的用法:
头文件<stack>
1.stack特点:先进后出
2.stack有关操作:
Stack<Type>s; //定义栈,Type为数据类型,,可以为int、float、char
s.push(i);//把i放到栈顶
s.top();//返回栈顶元素,但不删除
s.pop();//删除栈顶元素,但不返回
//出栈的时候有两个操作:top()获得栈顶元素,再pop()删除栈顶元素
s.size();//返回栈中元素个数
s.empty();//检查栈是否为空,空返回true,否则返回false
3.例题:
输入:”olleh !dlrow” 输出:“hello world!”
代码:
int main()
{
int n;
char ch;
cin>>n;
getchar();
while(n--)
{
stack<char>s;
while(true)
{
ch=getchar();
if(ch==' '||ch=='\n'||ch==EOF)
{
while(!s.empty())
{
cout<<s.top();
s.pop();
}
if(ch=='\n'||ch==EOF)
break;
cout<<" ";
}
else s.push(ch);
}
cout<<endl;
}
return 0;
}
关于queue的用法:
头文件<queue>
1.队列的特点:先进先出
2.队列的基本操作:
queue<type>q;//定义队列,type为类型int、char、float
q.push(item);//把item放到队尾中
q.front();//返回队首元素,但不删除
q.pop();//删除队首元素,但不返回
q.back();//返回队尾元素
q.size();//返回元素个数
q.empty();//检查队列是否为空
3.例题:
输入:1 abcd输出:abcd
代码:
int main()
{
char ch;
int n;
cin>>n;
queue<char>q;
getchar();
while(n--)
{
while(true)
{
ch=getchar();
if(ch=='\n'||ch==EOF)
{
while(!q.empty())
{
cout<<q.front();
q.pop();
}
break;
}
else q.push(ch);
}
cout<<endl;
}
return 0;
}
关于优先队列的用法:
头文件<queue>
1.优先队列的基本操作:
priority_queue<type>q;//type为类型
q.top();//返回优先队列的队首元素,但不删除
q.pop();//删除优先队列的队首元素,但不返回
q.push(i);//将i插入优先队列的队尾
2.int类型的默认优先为:从大到小
如图:
3.struct类型:
例题:医院有三个医生,医生根据病人的病情和看病时间看病,病人权值1~10,10病最重,
权值大的先看病,在权值相同的时候,谁先来给谁看。
输入:7 输出:
In 1 1 2
In 1 2 empty
Out 1 3
Out 2 1
In 2 1
Out 2
Out 1
代码:
struct patient
{
int id;
int val;
}pat;
bool operator<(patient a,patient b)
{
if(a.val==b.val) return a.id>b.id;
else return a.val<b.val;
}//当做优先队列的特殊排序
int main()
{
priority_queue<patient>q[5];
int n,tem=0;
cin>>n;
string s;
while(n--)
{
cin>>s;
if(s[0]=='I')
{
int d,rank;
cin>>d>>rank;
pat.id=++tem;
pat.val=rank;
q[d].push(pat);
}
else
{
int d;
cin>>d;
if(!q[d].empty())
{
cout<<q[d].top().id;
q[d].pop();
}
else cout<<"Empty";
cout<<endl;
}
}
return 0;
}
关于list的用法:
1.链表与队列的区别:
队列插入删除操作少,一般只在队首或者队尾插入或删除,随机访问较多。
链表插入删除操作多,随机访问少
2.例题:
输入:2 输出:
20 1 7 19
40 1 19 37
代码:
int main(){
int t,n;
cin>>t;
while(t--)
{
cin>>n;
int k=2;
list<int>l;
list<int>::iterator it;//迭代器it的大小一直在变;
for(int i=1;i<=n;i++) l.push_back(i);
while(l.size()>3)
{
int num=1;
for(it=l.begin();it!=l.end();)
{
if(num++%k==0) it=l.erase(it);
else it++;
}
k==2?k=3:k=2;
}
for(it=l.begin();it!=l.end();it++){
if(it!=l.begin()) cout<<" ";
cout<<*it;
}
cout<<endl;
}
return 0;
}