STL学习(4):deque双端容器

本文介绍了STL中的deque容器,它是一个支持高效头部和尾部操作的双端队列。deque允许快速随机访问元素,且提供了从头部和尾部插入、删除元素的高效功能。文章讲解了deque的常用函数,并通过实例展示了如何基于deque实现一个FIFO(先进先出)队列。
摘要由CSDN通过智能技术生成

STL学习网址:

deque容器为一个给定类型的元素进行线性处理,就如向量,它能够快速地随机进入任一个元素,并且能够高效地插入和删除容器的尾部元素。但它与vector不同,deque能支持高效插入和删除容器的头部元素,也叫做双端队列。

常用函数

  • push_back 从尾部插入元素
  • push_front 从头部插入元素
  • pop_back 从尾部删除元素
  • pop_front 从头部删除元素
//构造函数
 deque()                       //创建一个空deque
 deque(int nSize)              //创建一个deque, 元素个数为nSize
 deque(int nSize, const T& t)  //创建一个deque,元素个数为nSize, 且值均为t
 deque (const deque &)         //拷贝构造函数
//增加函数
 void push_front(const T& x)                 // 双端队列头部增加一个元素x
 void push_back(const T& x)                  // 双端队列尾部增加一个元素x
 iterator insert(iterator it, const T& x)    // 双端队列中某一元素前增加一个元素x
 void insert(iterator it, int n, const T& x) // 双端队列中某一元素前增加n个相同元素x
 void insert(iterator it,const_iterator first, const_iterator last)//
		                     // 双端队列中某一元素前插入另一个相同类型向量的[first,last)间的数据
//删除函数
 iterator erase(iterator it)                      //删除双端队列中某一个元素
 iterator erase(iterator first, iterator last)	 //删除双端队列中[first,last)中元素
 void pop_front()                                 //删除双端队列中最后一个元素
 void pop_back()                                  //删除双端队列中最后一个元素
 void clear()                                     //删除双端队列中所有元素
//遍历函数
 reference at(int pos)	  //返回pos位置元素的引用
 reference front()		  //返回首元素的引用
 reference back()         //返回尾元素的引用
 iterator begin()         //返回向量头指针,指向第一个元素
 iterator end()           //返回向量尾指针,不包括最后一个元素,在其下面
 reverse_iterator rbegin()//反向迭代器,功能等同iterator end()
 reverse_iterator rend()  //反向迭代器,功能等同iterator begin()
//判断函数
 bool empty() const		//向量是否为空?若true,则向量中无元素。
//大小函数
 int size() const		    //返回向量中元素的个数
 int max_size() const       //返回最大可允许的双端队列元素数量值
//其它函数
 void swap(vector&)             //交换两个同类型向量的数据
 void assign(int n, const T& x) //向量中第n个元素设置成元素x
 void assign(const_iterator first, const_iterator last)//向量中[first,last]元素设置成当前向量元素

知识点:

distance函数可以求出当前的迭代器指针it距离头部的位置,也就是容器的指针

用法: distance(v1.begin(), it)

    //定义deque对象
    deque<int> d1;

    //尾部插入元素
    d1.push_back(10);
    d1.push_back(20);
    d1.push_back(30);

    //头部插入元素
    d1.push_front(1);
    d1.push_front(2);
    d1.push_front(3);

    //尾部删除元素
    d1.pop_back();

    //头部删除元素
    d1.pop_front();

    //修改头部和尾部的值
    d1.front() = 111;
    d1.back()  = 222;

    //查找元素为1的下标
    //通过distance求取下标
    deque<int>::iterator it = d1.begin();
    while (it != d1.end()) {
        if (*it == 1) {
            cout << "下标:" << distance(d1.begin(), it) << endl;
        }
        it++;
    }

    //遍历
    for (deque<int>::iterator it = d1.begin(); it != d1.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;

deque中push_front、pop_front函数示例

deque可以通过push_front直接在容器头增加元素,通过pop_front直接删除容器头元素,这一点是vector元素不具备的。

#include <iostream>
#include <deque>
using namespace std;
void main()
{
	deque<int> d;
	d.push_back(10);
	d.push_back(20);
	d.push_back(30);
	cout << "原始双端队列:" ;
	for(int i=0; i<d.size(); i++)
	{
		cout << d.at(i) << "\t";	//10 20 30
	}
	cout << endl;
	d.push_front(5);
	d.push_front(3);
	d.push_front(1);
	cout << "push_front(5,3,1)后:";
	for(i=0; i<d.size(); i++)
	{
		cout << d.at(i) << "\t";	//1 3 5 10 20 30
	}
	cout << endl;
	d.pop_front();
	d.pop_front();
	cout << "两次pop_front后:";
	for(i=0; i<d.size(); i++)
	{
		cout << d.at(i) << "\t";	//5 10 20  30
	}
	cout << endl;	
}

以deque为基础,编一个先进先出的队列类。

分析:通常编制队列的方法是:定义数据结构,对具体的函数要一步步完成具体的代码。但是,仔细分析一下,队列操作仅是对队头完成删除操作,对尾完成插入操作,它所需要的功能完全在deque容器提供功能的范围之内。那么很自然想到从deque中提取需要的函数,这样具体的代码就不用重新编制了。

#include <iostream>
#include <deque>
using namespace std;
template <class T>
class MyQueue
{
	deque<T> d;
public:
	void push(const T& t)  //添加队尾元素
	{
		d.push_back(t);
	}
	void pop()	//删除队头元素
	{
		d.pop_front();
	}
	int size()	//获得队列大小 
	{
		return d.size();
	}
	bool empty() //队列空否
	{
		return d.empty();
	}
	T& front()	 //获得队头元素
	{
		return *d.begin();
	}
	T& back()	//获得对尾元素
	{
		return *(--d.end());
	}
	void display()
	{
		for(int i=0; i<d.size(); i++)
		{
			cout << d.at(i) << "\t";
		}
	}
};

void main() //测试函数
{
	MyQueue<int> myqueue;
	for(int i=1; i<=5; i++)//初始化队列:1 2 3 4 5
	{
		myqueue.push(i);
	}
	cout << "原队列:";
	myqueue.display(); cout << endl;//原队列显示:1 2 3 4 5
	myqueue.pop();					//删除队头元素 1
	cout << "删除队头元素后:";
	myqueue.display(); cout << endl;
	myqueue.push(6);				//插入队尾元素6
	cout << "插入队尾元素6后:";
	myqueue.display(); cout << endl;
	cout <<"当前队头元素:";
	cout << myqueue.front() << endl;//获得队头元素
	cout <<"当前队尾元素:";
	cout << myqueue.back() << endl;	//获得队尾元素
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值