浅整理一下STL(顺序式容器)vector、stack、queue、priority_queue、list

顺序式容器:

关于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;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值