网上总结deque原理和用法的文章有很多,我也是在学习中逐渐摸索总结,希望能够和大家共同进步。
DEQUE简介
deque是doble-ended queue的缩写,是STL标准模板库中的重要容器之一,可以通过设置来存放各种不同类型的数据。和vector容器不同的是,vector容器可以调用函数从容器末端插入或删除元素,而deque容器可以通过调用函数在容器的两端插入或删除元素。
DEQUE实现
在工程中创建一个deque对象,在deque上右键转到定义,可以找到deque对应的实现代码。
template<class _Ty,
class _Alloc = allocator<_Ty> >
class deque
: public _Deque_alloc<_Deque_base_types<_Ty, _Alloc> >
{ // circular queue of pointers to blocks
public:
typedef deque<_Ty, _Alloc> _Myt;
...
}
由于代码非常多,所以在这里只贴一小部分,能够看出,deque实际上是一个模板类,它通过类模板的形式来达到存储不同种数据的实现。也可以将其看做是存放某种数据类型的双端动态数组。
DEQUE使用方法
1.建立容器(构造对象)
//---无初值---
deque<int> d1; //表示存放int型的容器
deque<double> d1; //表示存放double型的容器
class color{...};
deque<color> dc1; //表示存放类color的容器
//---有初值---
deque<int> d1 = { 1, 2, 3, 4 }; //d1的元素是1、2、3、4
deque<int> d2(5); //d2的元素个数为5,元素值都为0
deque<int> d3(5, 1); //d3的元素个数为5,元素值都为1
deque<int> d4(d1); //拷贝构造,d4=d1
deque<int> d5(d1.begin(), d1.end()); //d5的元素是从d1的首个元素到最后一个元素
deque<int> d6(d1.begin(), d1.begin()+3);//d6的元素是d1的前3个元素
int ary[] = {1,2,3,4,5};
deque<int> d7(ary, ary+3); //d7的元素是数组ary中的前3个元素
这里和vector用法一致,带有(iter* _First, iter* _End)
的均为左闭右开。
2.容器赋值
//---assign函数---
deque<int> d1 = {1,2,3,4,5,6};
deque<int> d2;
d2.assign({1,2,3,4,5}); //d2被赋值为{1,2,3,4,5}
d2.assign(d1.begin(), d1.end()); //d2被赋值为d1的首个元素到最后一个元素
d2.assign(d1.begin(), d1.begin()+3); //d2被赋值为d1的首个元素到第3个元素
deque<int>::iterator iter = d1.begin();
d2.assign(iter, iter+3); //利用迭代器,d2被赋值为d1的首个元素到第3个元素
//---直接赋值---
d2 = d1; //爽!
3.容器长度的查询、设置和调整
//---查询长度---
deque<int> d1 = {1,2,3,4,5};
int len = d1.size(); //得到d1的长度,即元素个数
bool isEmpty = d1.empty(); //查询容器是否为空,是则返回true
注意:和vector不同,deque没有capacity()函数!
//---调整长度---
deque<int> d1 = {1,2,3,4,5};
d1.resize(8); //d1的元素个数改为8个,大于原长度则补默认值0
d1.resize(3); //d1的元素个数改为3个,小于原长度则删除后面2个
d1.resize(8, 88); //d1的元素个数改为8,大于原长度则补设定值88
d1.resize(3, 88); //d1的元素个数改为3,小于原长度则删除后面2个
deque容器调整长度和vector用法一致。
4.容器数据的增加、删除、查询和改动
1.数据添加
//---在末尾添加元素---
deque<int> d1 = {1,2,3,4,5};
d1.push_back(6); //在末尾添加元素,值为6
//---在首部添加元素---
d1.push_front(0); //在首部添加元素,值为0
//---在数据中间插入元素---
deque<int> d2 = {6,7,8,9,10};
d1.insert(d1.begin() + 1, d2.begin(), d2.end());//在d1的第1个元素的前面插入d2
d1.insert(d1.begin() + 1, 5, 66); //在d1的第1个元素的前面插入5个66
d1.insert(d1.begin() + 1, 66); //在d1的第1个元素的前面插入66
d1.insert(d1.begin() + 1, { 6,7,8 }); //在d1的第1个元素的前面插入{6,7,8}
2.数据删除
//---删除末尾元素---
deque<int> d1 = {1,2,3,4,5};
d1.pop_back(); //删除末尾元素5
d1.pop_front(); //删除首部元素1
//---删除中间元素---
d1.erase(d1.begin()+1); //删除第2个元素d1[1]
d1.erase(d1.begin()+1, d1.begin()+3); //删除从第2个到第3个元素,即从d1[1]至d1[2]。注意左开右闭!
//---删除所有元素---
d1.clear(); //爽!
3.数据的单独查询和改动
//---查找容器内是否包含某一元素---
deque<int> d1 = {1,2,3,4,5};
bool isFind = count(d1.begin(), d1.end(), 3);//在d1内查找3是否存在,是则返回1
//---下标操作---
int num1 = d1[3];
d1[3] = 6;
//---at函数---
int num2 = d1.at(3);
d1.at(3) = 6;
//---首位接口---
int num3 = d1.front(); //d1的首元素
int num4 = d1.back(); //d1的末元素
d1.front() = 6; //d1的首元素更改为6
d1.back() = 6; //d1的末元素更改为6
4.数据的依次查询或改动
//---通过循环---
deque<int> d1 = {1,2,3,4,5};
for(int i = 0; i < d1.size(); i++) {
cout << "第" << i << "个元素的值为:" << d1[i] << endl; //读取
d1[i] = 5; //赋值
}
//---通过迭代器---
queue<int>::iterator iter = d1.begin();
for(; iter != d1.end(); iter++) {
cout << *iter << endl; //读取
*iter = 5; //赋值
}
5.容器的其它操作
//需要头文件#include<algorithm>
//---排序---
deque<int> d1 = {2,1,3,4,5};
sort(d1.begin(), d1.end());//对容器d1内的数据进行排序,区间可选
//---反转---
reverse(d1.begin(), d1.end());//对容器d1进行反转,区间可选
//后面如果遇到再补充吧
关于STL的其它部分也会在以后的学习过程中继续更新,希望大家批评指正!
链接: C++STL标准模板库之容器vector.
我是没信号的法杖,无法发送信号,也无法接受信号。