学习C++之STL:简单了解queue顺序容器适配器及其常用接口

基本概念:
queue是一种先进先出的数据结构。
两个开口,一个开口只用于进队(push,添加数据),一个开口只用于出队(pop,移除数据)。
队列中只有队头(front,出口处)、队尾(back,入口处)两个元素可以被外界使用,因此队列没有遍历操作

接下来学习队列的 常用接口:
构造函数:

queue<T> que;//queue对象的默认构造形式,采用模板类实现
queue(const queue &que);//拷贝构造函数,所有适配器都支持

赋值操作:

queue& operator=(const queue &que);//重载等号操作符

数据存取:

push(elem);//往队尾添加元素,即入队
pop();//从队头移除第一个元素,即出队
back();//返回队尾,即最后一个元素
front();//返回队头,即第一个元素

大小操作:

empty();//判断堆栈是否为空,所有适配器都支持
size();//返回栈的大小,所有适配器都支持

数据交换:

swap(a,b);//交换a和b的内容,所有适配器都支持
a.swap(b);//a和b必须类型相同,底层容器类型也必须相同

接下来通过测试案例来体会这些接口的使用:

#include<iostream>
#include<queue>

using namespace std;

struct people//自定义数据类型
{
    string name;
    int age;
    people(string Name,int Age)
    {
        name=Name;
        age=Age;
    }
    void print()
    {
        cout<<name<<" "<<age<<endl;
    }
};

void test()
{
    queue<people> q1;

    if(q1.empty())//检验是否为空
      cout<<"q1为空"<<endl;
    else cout<<"q1非空"<<endl;
    cout<<"size of q1:"<<q1.size()<<endl;//查看q1大小
    
    q1.push(people("张三",20));//准备数据
    q1.push(people("李四",17));

    if(q1.empty())//检验是否为空
      cout<<"q1为空"<<endl;
    else cout<<"q1非空"<<endl;

    cout<<"size of q1:"<<q1.size()<<endl;//验证push操作会改动数据
    
    people p1(q1.front()),p2(q1.back());//取出q1队头、队尾
    cout<<"q1队头:";//输出确认
    p1.print();//应是张三
    cout<<"q1队尾:";
    p2.print();//应是李四

    cout<<"size of q1:"<<q1.size()<<endl;//验证取出队头、队尾不会改动数据
    q1.pop();//出队一个元素
    cout<<"size of q1:"<<q1.size()<<endl;//验证pop操作会改动数据

    queue<people> q2(q1);//使用拷贝构造
    cout<<"size of q2:"<<q2.size()<<endl;//应为1
    q2.push(p1);//入队一个元素

    swap(p1,p2);
    cout<<"q2队头:";//输出验证push操作传入的不是元素的引用(本身)
    (q2.front()).print();//顺便验证front、back操作都是返回元素本身(引用)
    cout<<"q2队尾:";
    (q2.back()).print();//应为李四、张三

    swap(q1,q2);//验证队列交换效果
    cout<<"q1队头:";
    (q1.front()).print();
    cout<<"q1队尾:";
    (q1.back()).print();
    cout<<"q2队头:";
    (q2.front()).print();
    cout<<"q2队尾:";
    (q2.back()).print();
}

int main()
{
    test();
    return 0;
}

代码运行结果:
在这里插入图片描述
此外,还发现一个有趣现象:在队列刚被创建还是空队列的时候,虽然调用size返回的值是0,但是队列的底层却有很大的空间(在我的电脑上是显示有1000个位置),就算调用拷贝构造函数,在定义语句没执行完前,队列内部的空间也是特别大,直到有元素入队,队列内部才具体化,有明确的大小,而且因为队列不允许遍历操作,所以调试模式下队列的元素的值不可见。不过这个超大的空间只在定义语句为执行完时可见。

q1定义语句未执行完时q1的状态。
在这里插入图片描述
用图说明这个超大空间有多大。
在这里插入图片描述
随后这个超大空间就不可见了。
在这里插入图片描述
q1有元素入队后。
在这里插入图片描述
调用拷贝构造的q2未执行完定义语句前的状态。
在这里插入图片描述
执行完后。
在这里插入图片描述
把q2清空以验证超大空间不可见。
在这里插入图片描述

发布了18 篇原创文章 · 获赞 36 · 访问量 770

猜你喜欢

转载自blog.csdn.net/qq_44643644/article/details/105408832