C++ STL学习之三:序列式容器deque深入学习

deque是双端队列,它的空间构造并非一个vector式的长数组,而是“分段存储,整体维护”的方式;STL允许在deque中任意位置操作元素(删除添加)(这超出了deque的概念,最原始的deque将元素操作限定在队列两端),允许遍历,允许随机访问(这是假象);我们将看到,deque将是STL中stack和queue的幕后功臣,对deque做适当的修正,便可以实现stack和queue。

C++ STL容器deque和vector很类似,也是采用动态数组来管理元素。

使用deque之前需包含头文件:

#include <deque>

它是定义在命名空间std内的一个class template:

template<class _Ty,
class _Ax = allocator<_Ty> >
class deque;

第一个template参数用来表示元素型别,第二个可有可无,指定内存模型。一般使用默认的内存模型。

与vector不同的是deque的动态数组首尾都开放,因此能够在首尾进行快速地插入和删除操作。

deque的逻辑结构:


deque的内部结构:

bug,deque_in_real

deque的特点:

1、支持随机访问,即支持[]以及at(),但是性能没有vector好。

2、可以在内部进行插入和删除操作,但性能不及list。

deque和vector的不同之处:

1、两端都能够快速插入和删除元素。vector只能在尾端进行。

2deque的元素存取和迭代器操作会稍微慢一些。因为deque的内部结构会多一个间接过程。

3、迭代器是特殊的智能指针,而不是一般指针。它需要在不同的区块之间跳转。

4deque可以包含更多的元素,其max_size可能更大。因为不止使用一块内存。

5、不支持对容量和内存分配时机的控制。

注意:在除了首尾两端的其他地方插入和删除元素,都将会导致指向deque元素的任何pointersreferencesiterators失效。不过,deque的内存重分配优于vector。因为其内部结构显示不需要复制所有元素。

6deque的内存区块不再被使用时,会被释放。deque的内存大小是可缩减的。不过,是不是这么做以及怎么做由实作版本定义。

 

dequevector相似的特性:

1、在中间部分插入和删除元素相对较慢,因为所有元素都要被移动。

2、迭代器属于随即存取迭代器。

 

最好采用deque的情形:

1、需要在两端插入和删除元素。

2、无需引用容器内的元素。

3、要求容器释放不再使用的元素。

 

deque的操作函数

构造函数和析构函数:

非变动性操作:


变动性操作:



deque的各项操作只有一下两点和vector不同:

deque不提供容量操作:capacity()reverse()

deque直接提供函数完成首尾元素的插入和删除。

其他均与vector相同。

注意:

1、除了at()函数,其他成员函数都不会检查索引或迭代器是否有效。

2、元素的插入和删除可能会导致内存重新分配。所以任何插入或删除操作都会使所有指向deque元素的pointers、reference、iterators失效。唯一例外的是在首尾插入元素之后,pointers和reference可能仍然有效。


deque<int> mydeque;
mydeque.push_back(10);
mydeque.push_back(20);
mydeque.push_back(60);
deque<int>::iterator iter;
iter = find(id.begin(),id.end(),60);
cout << *ite << endl;
<span style="font-family: Arial, Helvetica, sans-serif;">#include<iostream></span>
<span style="font-family: Arial, Helvetica, sans-serif;">#include<deque></span>
using namespace std;
void print(deque<string> &td)
{
	deque<string>::iterator iter;
	for(iter=td.begin();iter!=td.end();iter++)
		cout<<*iter<<"	";
	cout<<endl;
}
void print_reverse(deque<string> &td)//逆向打印
{
	deque<string>::reverse_iterator iter;
	for(iter=td.rbegin();iter!=td.rend();iter++)
		cout<<*iter<<"	";
	cout<<endl;
}
int main(int argc,char *argv[])
{
	deque<string> strdeq;
	strdeq.push_back("shen");
	strdeq.push_back("hua");
	strdeq.push_back("yu");
	strdeq.push_back("hust");
	print(strdeq);
	strdeq.push_front("name:");
	strdeq.insert(strdeq.begin()+3,"shenhuayu");
	print(strdeq);
	strdeq.erase(strdeq.begin()+2);
	strdeq.pop_front();
	strdeq.pop_back();
	print(strdeq);
	cout<<strdeq.front()<<"	"<<strdeq.back()<<"	" <<strdeq.size()<<endl;
	return 0;
}


shenhuayu@shenhuayu-VirtualBox ~/src $ g++ stltest.cpp -g -o mystltest
shenhuayu@shenhuayu-VirtualBox ~/src $ ./mystltest
shen hua yu hust
name: shen hua shenhuayu yu hust
shen shenhuayuyu
shen yu 3



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值