STL之容器适配器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhuyunfei/article/details/51762980

前言

在STL中定义了三种容器适配器:queue,priority_queue,和stack。
容器适配器是利用基本容器(如之前介绍的deque,vector,list)作为自己的底层容器,适配它以实现自己特定功能的容器。
容器适配器有一个共同的特点:都不支持迭代器(Iterator)。

1.queue

特点:FIFO(先进先出)原则。
模板定义

template <class T,class Container = deque<T>> class queue

T是指存储的数据类型
Container是指用于保存queue的容器类型,默认的容器是deque,还可以使用list作为queue的底层容器,但不能使用vector作为其的底层容器,因为vector不支持pop_front()函数。

queue的构造函数:

explicit queue(const Container &cnt = Container())

此构造函数创建空的queue。
queue的头文件是:

#include <queue>

queue成员函数

value_type &back();
const value_type &back() const
返回queue中最后一个元素
bool empty() const如果调用queue为空则返回true,否则返回false
value_type &front();
const value_type &front() const
返回queue中第一个元素
void pop()删除queue中第一个元素
void push(const T &val)将值为val的元素加到queue的尾部
size_type size() const返回queue中当前元素个数
    queue<int> q;

    q.push(1);
    q.push(2);
    q.push(3);
    q.push(4);

    if (!q.empty())
    {
        cout<<"size() = "<<q.size()<<"\n";
    }

    cout<<"back() = "<<q.back()<<" ; front() = "<<q.front()<<"\n";

    q.pop();
    cout<<"after pop, size() = "<<q.size()<<"\n";

    q.push(5);
    cout<<"after push(), size() = "<<q.size()<<"\n";

    cout<<"contents of queue: ";
    for (int i=0;i<q.size();i++)
    {
        cout<<q.front()<<" ";
        q.push(q.front());
        q.pop();
    }

结果为:
这里写图片描述

2.priority_queue

特点:按优先级来排序queue中的元素
类模板

template<class T,class Container = vector<T>, class Comp = less<Container::value_type> > class priority_queue

T指存储的数据类型
Container是保存priority queue的容器类型,默认是vector,底层容器必须支持随机访问迭代器,因此底层容器可以是deque,不能是list。
Comp指priority queue中元素的比较函数

priority_queue适配器有以下构造函数

explicit priority_queue(const Comp &cmpfn = Comp(),Container &cnt = Container());

template<class InIter>
priority_queue(InIter start,InIter end,const Comp &cmpfn = Comp(),Container &cnt = Container())

第一个构造函数创建空的priority_queue
第二个构造函数创建由start和end指定范围的priority queue。

priority_queue头文件:

#include <queue>

priority_queue成员函数

bool empty()如果调用priority_queue为空,返回true,否则返回false
void pop()删除priority_queue中第一个元素
void push(const T &val)将元素添加到priority_queue队列中
size_type size() const返回priority_queue中当前元素个数
const value_type &top() const返回priority_queue中优先级最高的元素,不删除元素

Example

#include <iostream>
#include <queue>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    priority_queue<double> pq;

    pq.push(1.0);
    pq.push(8.9);
    pq.push(3.5);
    cout<<"size  = "<<pq.size()<<"\n";
    while(!pq.empty()){
        cout<<pq.top()<<" \n";
        pq.pop();
    }

    return 1;
}

结果是:
这里写图片描述

3.stack

特点:后进先出。
类模板:

template <class T,class Container = deque<T> > class stack

T是存储的数据类型
Container指底层的容器类型,默认是deque,还可以使用vector,list作为其的底层容器。

stack适配器的构造函数:

explicit stack(const Container &cnt = Container())

创建空的stack
头文件是:

#include <stack>

stack成员函数

bool empty() const如果stack为空返回true,否则返回false
void pop()删除stack栈顶元素,也是容器中最后添加的元素
void push(const T &val)将元素压进堆栈,也就是栈顶元素
size_type size() const返回当前栈内元素个数
value_type &top();
const value_type &top() const
返回栈顶元素的引用,不会删除栈顶元素

Code Example

    stack<char> s;

    s.push('A');
    s.push('B');
    s.push('C');
    s.push('D');

    while (!s.empty())
    {
        cout<<"Popping: ";
        cout<<s.top()<<"\n";
        s.pop();
    }

结果是:
这里写图片描述

阅读更多
换一批

没有更多推荐了,返回首页