STL之deque详解

Deuqe概念

        容器deque和vector非常相似,属于序列式容器。都是采用动态数组来管理元素,提供随机存取,并且有着和vector一样的接口。不同的是deque具有首尾两端进行快速插入、删除的能力

Deque结构

        如图1是 deque的逻辑结构, 从表面上看,deque具有连续性的存储空间,并支持随机存取功能。 实际上deque并不是我们所看到的样子,其内部结构,如图2所示。
deque在实现上主要有以下两点:
1.由一段一段的定量连续空间构成,第一个区块朝某个方向扩展,最后一个区块朝相反方向扩展;
2.管理这些分段的定量连续空间,维护其整体连续的假象,并提供随机存取的接口;

             
                                                      图 1 deque的逻辑结构
             
                                                  图 2  deque的内部结构

Deque的能力

  与vector相比,deque功能上的不同之处在于
  • 首尾两端都能快速的安插、删除元素,因此需要在两端安插、删除元素时,最好采用deque。
  •  存在元素时,deque的内部结构会多一个间接过程,操作元素的效率会比vector低一些
  • 迭代器需要在不同区块间跳转,所以必须是特殊的智能指针,非一般指针。
  • deque不支持对容量和内存重分配时机的控制,除了首尾两端安插、删除元素外,其他地方安插、删除元素都将导致元素的pointer、reference、iterator失效。不过,deque的内存重分配机制优于vector,因为deque不必在内存重分配时复制所有的元素。
  • deque的内存区块不再被使用时,会被释放。
deque的操作函数
          Deque的操作函数和vector操作函数基本一模一样,操作函数列表见STL之vector函数详解
duque的各项操作只有以下几点和vector不同:
  1. deque不提供容量操作( capacity()、reserve() )
  2. deque提供push_front()、pop_front()函数直接操作头部
Deque的特点:
从deque的内部结构可知,deque元素是分布在一段段连续空间上,因此deque具有如下特点:
1、支持随机访问,即支持[]以及at(),但是性能没有vector好。
2、可以在内部进行插入和删除操作,但性能不及list。
由于deque在性能上并不是最高效的,有时候对deque元素进行排序,更高效的做法是,将deque的元素移到到vector再进行排序,然后在移到回来

举例

       我们操作deque时,不需要关心其内部结构的实现,我们按照deque的逻辑结构进行操作,可以认为deque是动态的一维数组,可在首尾进行插入、删除操作,下标从0开始。
#include "stdafx.h"
#include <deque>
#include <string>
#include <iostream>
#include <algorithm>

using namespace std;

void DequeExample()
{
	deque<string> strDeq;//空队列
	strDeq.assign(3, string("string"));//赋值

	//打印deque的内容
	for (unsigned i = 0; i < strDeq.size(); i++)
	{
		cout << "strDeq[" << i << "] :"  << strDeq[i] << endl;
	}
	
	cout << "push_front and push_back elem to deque" << endl;
	
	//首尾插入元素
	strDeq.push_front("first string");
	strDeq.push_back("last string");

	//打印deque的内容
	for (unsigned i = 0; i < strDeq.size(); i++)
	{
		cout << "strDeq[" << i << "] :" << strDeq[i] << endl;
	}

	cout << "pop_front and pop_back elem from deque" << endl;
	
	//首尾弹出元素
	strDeq.pop_front();
	strDeq.pop_back();

	//打印deque的内容
	for (unsigned i = 0; i < strDeq.size(); i++)
	{
		cout << "strDeq[" << i << "] :"  << strDeq[i] << endl;
	}
}

运行结果

          
参考文章:
       1.http://blog.csdn.net/xiajun07061225/article/details/7442816
       2.http://blog.csdn.net/hackbuteer1/article/details/7729451

转载于:https://www.cnblogs.com/jinxiang1224/p/8468418.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值