【蒟蒻数据结构】方便快捷的STL

你还在为手写优先队列而头疼吗?你还在为hash写不出而烦恼吗?你已经想我一样成为板子都不想背的夕阳红选手了吗?非常好,现在,隆重向你推荐一批超级好用的STL函数。

队列-queue

#include<queue>//queue头文件 
#include<cstdio>
#include<cstdlib>
using namespace std;
queue<int>q;//定义一个每个点都是int的队列q 
int main()
{
    q.push(3);//在队尾插入一个3 
    q.push(2);//在队尾插入一个2 

    printf("%d\n",q.front());//输出队头 

    printf("%d\n",q.back());//输出队尾 

    if(q.empty())printf("Yes\n");
    else printf("No\n");
    // q.empty() 判断q是否为空,空则返回True,不空则返回False 

    q.pop();//将队头退队 

    printf("%d\n",q.size());//输出队列中元素个数 
    return 0;
} 

优先队列-priority_queue

#include<queue>//queue头文件 
#include<cstdio>
#include<cstdlib>
using namespace std;
struct node
{
    int x,y;
    bool operator < (const node &v) const
    {
        if(x>v.x)return(true);
        else return(false);
    }//重载<号的定义 
};//定义node类型 
priority_queue<node>q;//定义一个每个点都是node的优先队列q 

node o;

int main()
{
    o.x=1;o.y=1;
    q.push(o);//在队列中插入o 

    o.x=2;o.y=2;
    q.push(o);//在队列中插入o 

    if(q.empty())printf("Yes\n");
    else printf("No\n");
    // q.empty() 判断q是否为空,空则返回True,不空则返回False 

    o=q.top();//输出优先队列的队头【此时以x为关键字从小到大排序】 

    printf("%d %d\n",o.x,o.y);//输出队头元素【也就是x值最小的元素】 

    printf("%d\n",q.size());//输出队列中元素个数 

    return 0;
}

双向队列-deque

#include<queue>//queue头文件 
#include<cstdio>
#include<cstdlib>
using namespace std;
deque<int>q;//定义一个每个点都是int的双向队列q 
int main()
{
    q.push_back(3);//在队尾插入一个3 
    q.push_front(2);//在队首插入一个2 

    printf("%d\n",q.front());//输出队头 

    printf("%d\n",q.back());//输出队尾 

    if(q.empty())printf("Yes\n");
    else printf("No\n");
    // q.empty() 判断q是否为空,空则返回True,不空则返回False 

    q.pop_front();//将队头退队 

    printf("%d\n",q.size());//输出队列中元素个数 
    return 0;
} 

栈-stack

#include<stack>//stack头文件 
#include<cstdio>
#include<cstdlib>
using namespace std;
stack<int>s;//定义一个每个节点都为int的栈s 
int main()
{
    s.push(1);//在栈顶插入一个1 
    s.push(2);//在栈顶插入一个2

    if(s.empty())printf("Yes\n");
    else printf("No\n");
    // s.empty() 判断s是否为空,空则返回True,不空则返回False 

    printf("%d\n",s.top());//输出栈顶元素

    s.pop();//将栈顶元素弹出 

    printf("%d\n",s.top());//输出栈顶元素

    printf("%d\n",s.size());//输出栈中元素个数 
    return 0;
}

大小可变数组-vector

#include<cstdio>
#include<vector>//vector头文件 
#include<cstdlib>
using namespace std;
vector<int>v;//定义一个每个元素都是int的可变长数组v 
int main()
{
    vector<int>::iterator beg,en; //定义vector迭代器

    v.push_back(1);//在v的末尾插入一个1 
    v.push_back(2);//在v的末尾插入一个2 
    v.push_back(3);//在v的末尾插入一个3 

    printf("%d\n",v[0]);//访问v中下标为0的值 
    printf("%d\n",v[1]);//访问v中下标为1的值
    printf("%d\n",v[2]);//访问v中下标为2的值

    v.pop_back();//将v的末尾弹出

    printf("%d\n",v.front());//输出v的开头

    v[1]=233;//修改v中下标为1的值 

    for(vector<int>::iterator  i=v.begin();i<v.end();i++)printf("%d\n",*i);
    //输出vector中的元素 

    v.erase(v.begin());//将在 v.begin() 位置的值删去 

    beg=v.begin();en=v.end();
    v.erase(beg,en);//将[v.begin(),v.end())之间的值全部删去 

    v.insert(beg,1);//在 v.begin() 位置假如一个1 

    v.clear();//清除整个v 
    return 0;
}

普通集合-set

#include<set>//set头文件 
#include<cstdio>
#include<cstdlib>
using namespace std;
set<int>s;//定义集合s【集合中无重复元素】 
set<int>ss;//定义集合ss 
int main()
{
    s.insert(1);//在s中插入一个1 
    s.insert(2);//在s中插入一个2 
    s.insert(3);//在s中插入一个3 

    ss.insert(s.begin(),s.end());//将s合并到ss上 

    printf("%d\n",ss.size());//输出ss的大小 

    if(ss.empty())printf("Yes\n");
    else printf("No\n");
    // ss.empty() 判断ss是否为空,空则返回True,不空则返回False

    set<int>::iterator it;//定义set迭代器 

    it=ss.begin();
    printf("%d\n",*it);//查询最小值 

    it=ss.end();it--;
    printf("%d\n",*it);//查询最大值 

    ss.erase(2);//将集合中的2删除 
    printf("%d\n",*ss.lower_bound(1));//输出集合中大于等于1的最小的数 
    printf("%d\n",*ss.upper_bound(2));//输出集合中大于2的最小的数 
    return 0; 
}

可重复集合-multiset

#include<set>//set头文件 
#include<cstdio>
#include<cstdlib>
using namespace std;
multiset<int>s;//定义集合s【集合中可存在重复元素】 
multiset<int>ss;//定义集合ss 
int main()
{
    s.insert(2);//在s中插入一个2 
    s.insert(2);//在s中插入第二个2 
    s.insert(3);//在s中插入一个3 

    ss.insert(s.begin(),s.end());//将s合并到ss上 

    printf("%d\n",ss.size());//输出ss的大小 

    if(ss.empty())printf("Yes\n");
    else printf("No\n");
    // ss.empty() 判断ss是否为空,空则返回True,不空则返回False

    set<int>::iterator it;//定义set迭代器 

    it=ss.begin();
    printf("%d\n",*it);//查询最小值 

    it=ss.end();it--;
    printf("%d\n",*it);//查询最大值 

    ss.erase(2);//将集合中的所有2删除 

    printf("%d\n",ss.size());//输出ss的大小 

    printf("%d\n",*ss.lower_bound(1));//输出集合中大于等于1的最小的数 
    printf("%d\n",*ss.upper_bound(2));//输出集合中大于2的最小的数 
    return 0; 
}

散列表-map

#include<map>//map头文件 
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<iostream> //这个不能少 
#include<algorithm>
using namespace std;
map<string,int> m;//定义一个以字符串为下标,值为整型的散列表 
int main()
{
    pair<string,int>mp; 

    m["abb"]=1;//将“abb”赋值为1 
    m["baa"]=2;//将“baa”赋值为2

    if(m.find("abb")==m.end())printf("No\n");
    else printf("Yes\n");
    //若存在“abb”,则返回 “abb”位置的迭代器 
    //若不存在“abb”,则返回 m.end()

    mp=*m.find("abb");
    printf("%d\n",mp.second);//输出“abb”的对应值 

    m["abb"]=1;//将“abb”赋值为1 
    m["baa"]=2;//将“baa”赋值为2

    if(m.find("abbb")==m.end())printf("No\n");
    //若存在“abbb”,则返回 含有“abb”的迭代器  
    //若不存在“abbb”,则返回 m.end()

    else printf("Yes\n");
}

结语

转眼间,蒟蒻就高三退役啦,再更新完最后几篇BLOG后,我就要去学文化课啦,期待着我们下一次的相遇。最后希望你喜欢这篇BLOG!

Last modification:January 29th, 2019 at 10:05 pm
If you think my article is useful to you, please feel free to appreciate

4 comments

  1. 寒夏

    友情提示:
    不要过于依赖stl,OI在没有氧气(O2)的情况下虽然stl卡常几率微乎其微,但还是有的
    (你可以向某学长学习5分钟平衡树热身)

    1. jvruo
      @寒夏

      比如yjh?(滑稽OωO)

  2. FlyInTheSky

    Orz

    1. jvruo
      @FlyInTheSky

      大佬太巨了Orz

Leave a Comment