【C++自学笔记】STL—详细理解deque

一、deque的介绍

1、deque是一种动态大小的双端队列,属于序列式容器,两端均可伸缩;

2、特定的库可以以不同的方式实现deque ,但是通常都是一种动态数组,不论任何情况下,它都允许通过随机访问迭代器的方式直接访问单个元素,可以根据需要动态伸缩;

3、deque 提供了一些与 vector 类似的功能,但是 deque 在头部和尾部的插入过程中效率更高,与 vector 不同的是,deque 不能保证所有的元素存储在连续空间中,在 deque 中通过指针加偏移量的方式访问元素可能会导致非法操作;

4、vector 与 list 提供了一些类似的接口,但是内部实现原理不同:vector 使用了动态数组,deque 中的元素可能分散在不同的存储块中,在deque中保存了一些必要的信息,通常用来在常数范围内直接访问 deque的任何一个元素, 所以deque 的内部实现比 vector 复杂;

5、除了在频繁的头、尾插入和删除外,deque 比list 和 forward_list性能更差; 

二、deque的使用

1、deque的构造

函数声明接口说明

deque()

构造空的双端队列

deque(size_type n,const value_type& val = value_type())

用n个val来构造双端队列

deque(Inputlterator first,Inputlterator last)用[first,last)区间里构造
deque(const deque& x)拷贝构造

 

void MakeDequeTest() {
	deque<int> d1;
	deque<int> d2(5);
	deque<int> d3(5, 5);

	vector<int> v{ 9,5,2,7 };
	deque<int> d4(v.begin(),v.end());
	deque<int> d5(d4);

	PrintDeque(d1);
	PrintDeque(d2);
	PrintDeque(d3);
	PrintDeque(d4);
	PrintDeque(d5);
}

2、deque的迭代器

双端队列底层是一段假象的连续空间,实际上是分层的,为了维护其假象,落在了deque的迭代器上;

函数声明接口说明
iterator begin()返回deque的起始位置
iterator end()返回deque最后一个元素的下一位置
reverse_iterator rbegin()返回deque其实位置的反向迭代器(end)
reverse_iterator rend()返回deque最后一个元素的下一位置(begin)
const_iterator cbegin() const返回deque起始位置的const 迭代器
cnost_iterator cend() const

返回deque最后一个元素的下一位置const

const_reverse_iterator crbegin() const返回deque起始位置(crend)
const_reverse_iterator crend() const返回deque最后一个元素下个位置(crbegin)
void DequeIteratorTest() {
	int array[] = { 1,2,3,4,5,6,7,8,9 };
	deque<int> d(array, array + sizeof(array) / sizeof(int));
	
	for (auto it = d.cbegin(); it != d.cend(); ++it) 
		cout << *it << " ";
	cout << endl;

	for (auto it = d.crbegin(); it != d.crend(); ++it)
		cout << *it << " ";
	cout << endl;


}

3、deque capacity

函数声明接口说明
size_type size() cosnt返回deque中有效元素个数
bool empty() const检测deque是否为空
void resize(size_type sz,T c = T())将deque的元素改变到sz个,多余部分填c

 

4、deque的元素访问操作

函数声明

接口说明

reference operator[](size_type n)返回n位置上元素的引用
const_reference operator[](size_type n)const

返回n位置上元素的cosnt 引用

reference front()

返回首元素的引用

const_reference front() cosnt返回首元素的const 引用
reference back()返回最后一个元素的引用

const_reference back() cosnt

返回最后一个元素的cosnt 引用

5、deque中修改操作

函数声明

接口说明

void push_back(const value_type* val)尾插
void pop_back()尾删
void push_front(const valuse_type* val)头插
void pop_front()头删
iterator insert(iterator position,const value_type& val)

在pos插入val

void insert(iterator position,size_type n,const value_type& val)

在pos插入n个val

void insert(iterator position,Inputlterator frist,Inputlterator last)在pos插入[frist,last)
iterator erase(iterator position)删除pos,并返回下一个位置
iterator erase(iterator first,iterator last)删除[frist,last),并返回last的位置
void swap(deque& x)

交换

void clear()

清空

iterator empalce(const_iterator position,Args.. args)

在pos处构造元素,将元素所需要内容通过参数类表传入

void empalce_front(Args.. args)

在头部构造元素
void empalce_backe(Args.. args)在尾部构造元素
void Test() {
	deque<int> d1{ 3,4,5 };

	d1.push_back(6);
	d1.push_front(2);
	PrintDeque(d1);
	cout << d1.size() << endl;
	cout << d1.front() << endl;
	cout << d1.back() << endl;

	d1.emplace_back(7);
	d1.emplace_front(1);
	PrintDeque(d1);

	d1.insert(d1.begin(), 0);
	PrintDeque(d1);

	d1.pop_front();
	d1.pop_back();
	d1.erase(d1.begin());
	PrintDeque(d1);

	d1.clear();
	PrintDeque(d1);
}

三、deque的应用场景

deque在序列容器中是比较鸡肋的,应用如果只是简单的存储元素,使用vector即可,如果对元素任意位置进入插入或者删除操作比较多,使用vector即可,所以一般很少使用deque 。但是deque 的最大应用就是对 stack 和 queue 的底层结构;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_ClivenZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值