STL学习网址:
- C语言中文网:http://c.biancheng.net/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; //获得队尾元素
}