zoukankan      html  css  js  c++  java
  • STL之 stack/queue/priority_queue

    记性不好,贴点备忘的吧

    1、stack

    stack模板类的定义在<stack>头文件中。

    stack模板类需要两个模板参数,一个是元素类型,一个容器类型,但只有元素类型是必要的,在不指定容器类型时,默认的容器类型为deque。

    定义stack对象的示例代码如下:

    stack<int> s1;
    stack<string> s2;

    stack的基本操作有:

    入栈,如例:s.push(x);

    出栈,如例:s.pop();注意,出栈操作只是删除栈顶元素,并不返回该元素。

    访问栈顶,如例:s.top()

    判断栈空,如例:s.empty(),当栈空时,返回true。

    访问栈中的元素个数,如例:s.size()

    2、queue

    queue模板类的定义在<queue>头文件中。

    与stack模板类很相似,queue模板类也需要两个模板参数,一个是元素类型,一个容器类型,元素类型是必要的,容器类型是可选的,默认为deque类型。

    定义queue对象的示例代码如下:

    queue<int> q1;
    queue<double> q2;

    queue的基本操作有:

    入队,如例:q.push(x); 将x接到队列的末端。

    出队,如例:q.pop(); 弹出队列的第一个元素,注意,并不会返回被弹出元素的值。

    访问队首元素,如例:q.front(),即最早被压入队列的元素。

    访问队尾元素,如例:q.back(),即最后被压入队列的元素。

    判断队列空,如例:q.empty(),当队列空时,返回true。

    访问队列中的元素个数,如例:q.size()

    3、priority_queue

    在<queue>头文件中,还定义了另一个非常有用的模板类priority_queue(优先队列)。优先队列与队列的差别在于优先队列不是按照入队的顺序出队,而是按照队列中元素的优先权顺序出队(默认为大者优先,也可以通过指定算子来指定自己的优先顺序)。

    priority_queue模板类有三个模板参数,第一个是元素类型,第二个容器类型,第三个是比较算子。其中后两个都可以省略,默认容器为vector,默认算子为less,即小的往前排,大的往后排(出队时序列尾的元素出队)。

    定义priority_queue对象的示例代码如下:

    priority_queue<int> q1;
    priority_queue< pair<int, int> > q2; // 注意在两个尖括号之间一定要留空格。
    priority_queue<int, vector<int>, greater<int> > q3; // 定义小的先出队

    priority_queue的基本操作与queue相同。

    使用priority_queue时,最困难的可能就是如何定义比较算子了。

    基本数据类型 或已定义了比较运算符的类,可以直接用STL的less算子和greater算子——默认为使用less算子,即小的往前排,大的先出队。

    #include <iostream>
    #include <queue>
    using namespace std;

    int main()
    {

    priority_queue<int,deque<int>,greater<int> > p;
    priority_queue<int ,deque<int>,less<int> > p1;
    int n=5;
    while(n--) p.push(n);
    while(n!=4) p1.push(++n);

    while(!p.empty())
    {
    cout<<p.top()<<" ";
    p.pop();
    }
    cout<<endl;
    while(!p1.empty())
    {
    cout<<p1.top()<<" ";
    p1.pop();
    }
    return 0;
    }

     自定义数据类型

    定义自己的比较算子,方法有多种,重载比较运算符。

    #include <iostream>
    #include <queue>
    using namespace std;
    class T
    {
    public:
    int x, y, z;
    T(int a, int b, int c):x(a), y(b), z(c)
    {
    }
    };
    bool operator < (const T &t1, const T &t2)
    {
    return t1.z < t2.z; // 按照z的顺序来决定t1和t2的顺序
    }
    main()
    {
    priority_queue<T> q;
    q.push(T(4,4,3));
    q.push(T(2,2,5));
    q.push(T(1,5,4));
    q.push(T(3,3,6));

    while (!q.empty())
    {
    T t = q.top(); q.pop();
    cout << t.x << " " << t.y << " " << t.z << endl;
    }
    return 1;
    }

    输出结果为(注意是按照z的顺序从大到小出队的):

    3 3 6
    2 2 5
    1 5 4
    4 4 3


  • 相关阅读:
    Java核心技术Java程序设计
    Mac下查看 Java 安装目录位置和安装数量
    Intellij IDEA快捷键与使用小技巧
    Java 8 新特性 用 Collectors 对 List 去重
    onInterceptTouchEvent()与onTouchEvent()的机制
    Android 开发之多线程处理、Handler
    安卓中使用XmlPullParser解析xml文件
    监控部署nagios+snmp
    阿里RDS数据库 全量备份恢复到本地MYSQL
    20120412
  • 原文地址:https://www.cnblogs.com/skyming/p/2427602.html
Copyright © 2011-2022 走看看