学习C++:自适应容器(栈和队列)

前言
标准模板库(STL)提供了一些容器(比如stack、queue、priority_queue),使用这些容器来模拟栈和队列的行为。
这种内部使用一种容器但呈现另一种容器的行为特征称为自适应容器。

1.栈和队列的行为特征

栈和队列与数组或list非常相似,但是对插入、访问和删除元素的方式有一定的限制。可将元素插入到什么位置以及可以从什么位置删除元素决定了容器的行为特征。
:栈是先进后出系统,只能从栈顶插入或者删除元素。
队列:队列是先进先出系统,元素被插入到队尾,从队头删除,最先插入的元素最先删除。可将队列视为在电影院排队买票的人,先加入队列的人先离开。

2.使用STL stack类

泛型STL容器std::stack模拟了栈的这种行为。要使用stack,必须包含头文件:

#include <stack>

STL stack 是一个模板类。允许在顶部插入和删除元素,而不允许访问中间的元素。
在STL实现中,std::stack的定义如下:
template<class elementType, class Container=deque>class stack;
参数elementType是stack存储的对象类型
第二个模板参数Container是stack使用的默认底层容器实现类。默认是使用std::deque来存储数据,但可以指定使用vector或list来存储数据。
实例化stack
创建用于存储double类型的元素的栈:
stack stackDoubles;
创建存储类(如Tuna)对象的栈:
stack stackTunas;
创建存储double类型元素,并且使用vector作为底层容器的栈:
stack::<double, vector >stackDoublesInVector;
使用一个stack对象的拷贝来创建另一个stack对象:
stack stackIntsCopy(stackInts);
stack的成员函数
stack改变了另一种容器(如deque、list或vector)的行为,通过限制元素插入或删除的方式实现其功能,从而提供严格遵守栈机制的行为特征。
1.push
stackInts.push(25); //在栈顶插入元素
2.pop
stackInts.pop(); //删除栈顶的元素
3.empty
if(stackInts.empty()){DoSomething;} //判断栈是否为空
4.size
size_t nNum=stackInts.size(); //返回栈中的元素数
5.top
stackInts.top(); //获得指向栈顶元素的引用

3.使用STL queue类

STL queue是一个模板类。只允许在末尾插入元素以及从开头删除元素;queue不允许访问中间的元素,但可以访问开头和末尾的元素。
泛型STL容器std::queue模拟了队列的这种行为。要使用queue,必须包含头文件:

#include <queue>

std::queue的定义如下:
template<class elementType, class Container=deque>class queue;
第一个参数elementType,是queue对象包含的元素的类型。
第二个参数Container,是用于存储其数据的集合的类型。默认情况下为deque,也可设置为list或vector。
实例化queue
创建存储类型为int的队列:
queue qIntegers;
创建存储元素类型为double,且使用std::list存储这些元素:
queue <double, list>qDoublesInList;
使用一个queue实例化另一个queue:
queue qCopy(qIntegers);
queue的成员函数
1.push
qIntegers.push(25); //在队尾插入一个元素
2.pop
qIntegers.pop(); //将队首的元素删除
3.front
qIntegers.front(); //返回指向队首的引用
4.back
qIntegers.back(); //返回指向队尾的引用
5.empty
if(qIntegers.empty()){} //检查队列是否为空
6.size
size_t nNum=qIntegers.size(); //返回队列的元素数

4.使用STL优先级队列priority_queue

STL priority_queue 是一个模板类,使用它,也必须包含头文件:

#include <queue>

priority_queue与queue的不同之处在于,包含最大值的元素位于队首(默认情况下),且只能在队首执行操作。
实例化
std::priority_queue类的定义如下:
template<class elementType, class Container=vector, class Compare=less> class priority_queue
第三个参数Compare指定一个二元谓词。默认使用std::less,从大到小排序,即队首为最大值。使用greater从小到大排序。
实例化一个整型的优先级队列:
priority_queue pqIntegers;
创建一个元素类型为double,且按从小到大的顺序存储在std::deque中的优先级队列:
priority_queue <int, deque, greater >pqIntegers_Inverse;
使用一个priority_queue来实例化另一个priority_queue:
pqIntegers pqCopy(pqIntegers);
priority_queue的成员函数
1.push
pqIntegers.push(10); //在优先队列中插入一个元素
2.pop
pqIntegers.pop(); //删除队首元素,即最大的元素
3.top
pqIntegers.top(); //返回队列中队首元素的引用(即最大的元素)
4.empty
if(pqIntegers.empty()){} //检查是否为空
5.size
pqIntegers.size(); // 返回优先队列中的元素个数

发布了12 篇原创文章 · 获赞 13 · 访问量 619

猜你喜欢

转载自blog.csdn.net/wjinjie/article/details/104273674