C++容器适配器——栈、队列


容器适配器是一个封装了序列容器的类模板,STL中的容器适配器由 stackqueuepriority_queue三种,他们可通过适配器现有的接口提供不同的功能,三种适配器功能如下:

  • stack< T >:是一个封装了 deque< T > 容器的适配器类模板,其可实现后入先出(Last-In-First-Out,LIFO)的占,其定义的头文件在stack中;
  • queue< T >:是一个封装了 deque< T > 容器的适配器类模板,其可实现先入先出(First-In-First-Out,LIFO)的队列,其定义的头文件在queue中;
  • priority_queue< T >:是一个封装了 vector< T > 容器的适配器类模板,其实现了对元素排序,从而保证最大元素在队列最前面的队列,其定义的头文件在queue中。

stack容器

  前面说古该适配器中的数据以LIFO的方式组织(栈),和自助餐馆中的碟盘子类似,只有在一出了容器顶部的元素后在能访问下方元素,基本操作示意图如下:
在这里插入图片描述
  除了上述基本操作,其还有下面几个操作:

函数原型 作用
size() 返回栈中元素的个数
empty() 在栈中没有元素的情况下返回 true
swap(stack & other_stack) 将当前栈中的元素和参数中的元素交换。参数所包含元素的类型必须和当前栈的相同

  我们可用该容器将一个数按照规定的进制输出示例代码如下:

#include <iostream>
#include <stack>  //使用stack需要包含此头文件
using namespace std;
int main()
{
    int n, k;
    stack <int> stk;
    cin >> n >> k;  //将n转换为k进制数
    if (n == 0) {
        cout << 0;
        return 0;
    }
    while (n) {
        stk.push(n%k);
        n /= k;
    }
    while (!stk.empty()) {
        cout << stk.top();
        stk.pop();
    }
    return 0;
}

  运行结果如下:

4 2
100

queue容器

  queue即队列,只能在末尾添加新元素,在头部移除元素,可联系到我们生活中的排队买票,下图所展示了该容器的一些基本操作:
在这里插入图片描述
  queue同样和stack类似的push、pop、top函数,只不过queue的push发生在队尾,pop和top发生在队头,还有如下基本操作:

函数原型 作用
size() 返回 queue 中元素的个数
empty() 如果 queue 中没有元素的话,返回 true
swap(queue &other_q) 将当前 queue 中的元素和参数 queue 中的元素交换。它们需要包含相同类型的元素

  示例代码如下:

#include <queue>
#include <iostream>
using namespace std;
int main()
{
    queue<int> myQ;
    for (int i = 0; i < 10; i++)
        myQ.push(i);
    cout << "myQ size is: " << myQ.size() << endl;
    for (int i = 0; i < myQ.size(); i++)
    {
        cout << myQ.front() << endl;
        myQ.pop();
    }
    cout << "myQ size is: " << myQ.size() << endl;
    return 0;
}

  运行结果如下:

myQ size is: 10
0
1
2
3
4
myQ size is: 5

priority_queue容器

  即优先队列,他和普通队列的区别就是该队列的队头元素总是最大,执行pop操作时,删除的总是最大的元素,执行top操作时引用的也是最大的操作;该容器可用vector和deque实现,默认用vector,放入容器的元素必须为“<”运算符比较的,且总可保证对于队头元素x和任意非队头元素y,表达式“x<y”必为false。
函数定义如下:

priority_queue<int> q;
priority_queue<int, vector<int>, less<int> > q;
priority_queue<double, vector<double>, greater<double> > q;

在后面两种定义中,多出来两个参数vector<>和less<>(greater<>),第二个参数vector<>用来承载底层数据结构堆(heap);第三个参数是对第一个参数的比较类,less表示数字越大优先级越大,greater表示数字越小,优先级越大。其采用的是堆排序实现,虽然内部不是完全有序,但却总能保证最大元素在队头,因此特别适用在一堆元素中取走最大的元素。
  示例代码:

#include <queue>
#include <iostream>
using namespace std;
int main()
{
    priority_queue<double> pq1;
    pq1.push(3.2); pq1.push(9.8); pq1.push(9.8); pq1.push(5.4);
    while (!pq1.empty()) {
        cout << pq1.top() << " ";
        pq1.pop();
    } //上面输出 9.8 9.8 5.4 3.2
    cout << endl;
    priority_queue<double, vector<double>, greater<double> > pq2;
    pq2.push(3.2); pq2.push(9.8); pq2.push(9.8); pq2.push(5.4);
    while (!pq2.empty()) {
        cout << pq2.top() << " ";
        pq2.pop();
    }
    //上面输出 3.2 5.4 9.8 9.8
    return 0;
}

运行结果为:

9.8 9.8 5.4 3.2
3.2 5.4 9.8 9.8

巨人的肩膀:priority_queue的常见用法详解

猜你喜欢

转载自blog.csdn.net/weixin_42647166/article/details/105857089