【STL】deque简介

一、deque简介

         deque(double-ended queue)是一个双端队列。在头部和尾部对元素进行删除和插入操作非常之快。

        deque是一个双端顺序容器,支持元素的快速随机访问。其大小也是可变的,可以通过删减元素和插入来对内存进行动态管理。但是,要是从中间插入或者删除元素,deque的效率就很低了。

二、deque和vector的对比

        对比起vector,deque不仅仅支持从尾部插入/删除元素,还支持从头部插入元素/删除元素。同时,deque中元素所存储的位置和vector大有不同,vector存在一段连续的内存空间,而deque则不能保证容器内的元素都存放在一段连续的内容空间内。所以,在对deque通过指针的移位的方式来访问其中元素时,可能会出现错误。

        vector中所有的元素都是存储在一块连续的内存空间当中,当空间不足的时候,会使用allocator在内存空间后重新开辟新的内存 ,以保证元素顺序存储。而deque有所不同,虽然deque是一个顺序容器,但是他的元素存储可以不连续,可以分为多个内存块,当遍历deque中元素的时候,会通过内存快与块一件的接口对所有元素进行逐一访问。如下图所示:

        通过上图可以很容器看出,当在处理那些长的,元素数量比较多的数列是,vector的代价比起deque的代价高的多。

三、容器特性

1.顺序容器

2.动态数组

3.动态内存分配

四、模板参数

1.T

         元素的类型,deque::value_type

2.Alloc

        allocator的类型,using to define the storage allocation model.   deque::allocator_type

五、类型

member typedefinitionnotes
value_typeThe first template parameter (T) 
allocator_typeThe second template parameter (Alloc)defaults to: allocator<value_type>
referencevalue_type& 
const_referenceconst value_type& 
pointerallocator_traits<allocator_type>::pointerfor the default allocator: value_type*
const_pointerallocator_traits<allocator_type>::const_pointerfor the default allocator: const value_type*
iteratorrandom access iterator to value_typeconvertible to const_iterator
const_iteratorrandom access iterator to const value_type 
reverse_iteratorreverse_iterator<iterator> 
const_reverse_iteratorreverse_iterator<const_iterator> 
difference_typea signed integral type, identical to:
iterator_traits<iterator>::difference_type
usually the same as ptrdiff_t
size_typean unsigned integral type that can represent any non-negative value of difference_typeusually the same as size_t

六、成员函数(和vector基本上相似)

1.构造/析构函数

1.构造函数  //constructor
2.析构函数  //destructor
3.赋值操作符   //operator = ;

2.迭代器

begin   //begin  返回一个迭代器,指向deque的第一个元素
end     //end   返回一个迭代器,指向deque末尾元素的后一个位置
 
rbegin  //rbegin  返回一个反向迭代器,指向deque“反向”起始位置,也就是最后一个元素
rend    //rend  但会一个反向迭代,指向deque“反向”末尾位置的后一个元素。如果需要反向遍历访问第一个元素,则需要 -1
 
cbegin  //返回一个const_iterator,指向deque的第一个元素
cend
 
crbegin //返回一个const_reverse_iterator,指向deque“反向”起始位置
crend

3.容器

size             //返回size
max_size         //返回max_size
resize           //重置size的大小
empty            //判断容器是否为空
shrink_to_fit    //要求deque改变其capacity去适应其size

4.元素访问

operator []  //支持下标操作符访问  同样也支持迭代器访问
at(n)        //访问下表为n的那个元素
front        //访问首个元素
back         //访问末尾元素

5.修改

assign         //指定deque的内容
push_back      //从尾部插入元素
push_front     //从头部插入元素
pop_back       //从尾部弹出元素
pop_front      //从尾部弹出元素
insert         //从中间插入元素 (效率不高)
erase          //从中间删除元素 (效率不高)
swap           //交换数组内容
clear          //清除deque的内容
emplace        //构建并且插入元素
emplace_front  //在头部构建并且插入元素
emplace_back   //在尾部构建并且插入元素

七、实例

#include <iostream>
#include <deque>

using namespace std;

void print(deque<int> dq)
{/*
	for (auto& r : dq)   //下标操作符可以进行遍历
		cout << r << ends;
	cout << endl;
	*/  

	deque<int>::iterator it;
	for (it = dq.begin(); it != dq.end(); it++)  //迭代器也可以遍历
		cout << *it << ends;;
	cout << endl;
}

void main()
{
	deque<int> dq1 = { 1,2,3,4,5,6,7,8,9 };
	deque<int> dq2(4, 3); //4个3
	deque<int> dq3(dq1.begin() + 1 ,dq1.end() - 1);  //赋值一个范围
	deque<int> dq4;

	dq4 = dq1; //operator =
	
	cout << "deque 1 : ";
	print(dq1);

	cout << "deque 2 : ";
	print(dq2);

	cout << "deque 3 : ";
	print(dq3);

	cout << "deque 4 : ";
	print(dq4);

	cout << "--------------------------------" << endl;
	cout << "dq1 size : " << dq1.size() << endl;
	cout << "dq1 max_size : " << dq1.max_size() << endl;
	//通过结果可以看出,deque的size 和 max_size 也不一样

	deque<int> dq5(100);
	cout << "dq5 size(before resize) : " << dq5.size() << endl;
	dq5.resize(10);
	cout << "dq5 size(after resize) : " << dq5.size() << endl;
	dq5.shrink_to_fit(); //Requests the container to reduce its memory usage to fit its size
	
	if (!dq5.empty()) { cout << "dq5 is not empty! " << endl; }

	cout << "--------------------------------" << endl;
	cout << "dq1 : ";
	print(dq1);
	cout << "dq1[5] : " << dq1[5] << endl;
	cout << "at[5] : " << dq1.at(5) << endl;
	cout << "dq1 front : " << dq1.front() << endl;
	cout << "dq1 end : " << dq1.back() << endl;

	//其他的与vector基本相同,就不实现了
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值