博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
deque与vector的主要区别
阅读量:6970 次
发布时间:2019-06-27

本文共 1148 字,大约阅读时间需要 3 分钟。


deque与vector非常相似。它也采用动态数组管理元素,提供随机存取,有着和vector几乎一样的接口。不同的是deque的动态数组头尾都开放,因此能在头尾两端进行快速安插和删除。


deque通常实作为一组独立区块,第一区块朝某方向扩展,最后一个区块朝另一个方向扩展。


deque与vector的主要不同之处在于:

1. 两端都能快速安插和删除元素,这些操作可以在分期摊还的常数时间(amortized constant time)内完成。

2. 元素的存取和迭代器的动作比vector稍慢。

3. 迭代器需要在不同区块间跳转,所以它非一般指针。

4. 因为deque使用不止一块内存(而vector必须使用一块连续内存),所以deque的max_size()可能更大。

5. 不支持对容量和内存重新分配时机的控制。不过deque的内存重分配优于vector,因为其内部结构显示,deque不必在内存重分配时复制所有元素。

6. 除了头尾两端,在任何地方安插或删除元素,都将导致指向deque元素的所有pointers、references、iterators失效。

7. deque的内存区块不再被使用时,会自动被释放。deque的内存大小是可自动缩减的。

8. deque与vector组织内存的方式不一样。在底层,deque按“页”(page)或“块”(chunk)来分配存储器,每页包含固定数目的元素。而vector只分配一块连续的内存。例如,一个10M字节的vector使用的是一整块10M字节的内存,而deque可以使用一串更小的内存块,比如10块1M的内存。所以不能将deque的地址(如&deque[0])传递给传统的C API,因为deque内部所使用的内存不一定会连续。


deque的下述特性与vector差不多:

1. 在中部安插、删除元素的速度较慢。

2. 迭代器属于random access iterator(随机存取迭代器)。


优先使用vector,还是deque?

c++标准建议:vector是那种应该在默认情况下使用的序列。如果大多数插入和删除操作发生在序列的头部或尾部时,应该选用deque。


使用deque还需注意:

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

2. 任何插入或删除动作都会使所有指向deque元素的pointers、references、iteartors失效,唯一例外的是在头部或尾部插入元素(此时pointers和references仍然有效,但iterators失效)。


 

转载于:https://www.cnblogs.com/zhuyf87/archive/2012/12/09/2809896.html

你可能感兴趣的文章
Javascript基础知识
查看>>
ajax sys未定义
查看>>
GBin1专题之Web热点秀#13
查看>>
Alpine Linux 2.5.0 发布,面向路由器、防火墙
查看>>
id自增,如何清除表里的数据,并重新设置索引
查看>>
Mon Dec 03 09:40:40 CST 2012 转时间格式
查看>>
【JAVA学习笔记】静态导入
查看>>
异步编程:使用线程池管理线程
查看>>
每日英语:After Online Scandals, Officials Push Back
查看>>
希尔排序
查看>>
iphone 的io操作详解
查看>>
5 Prepare to Use a Boost Library Binary
查看>>
js控制键盘按键(回车、空格)
查看>>
MEF开发资源
查看>>
编译thrift和使用 - 翱翔云颠的博客 - 我的搜狐
查看>>
BAT批处理修改MSDOS窗口标题、大小、字体及背景颜色
查看>>
mongodb固定集合(Capped Collection)和大文件管理(GridFS)
查看>>
厚积薄发,丰富的公用类库积累,助你高效进行系统开发(14)---Winform开发的常用类库(终结篇,CHM文档放送)...
查看>>
Java中的ReentrantLock和synchronized两种锁定机制的对比
查看>>
找人办事,代理设计模式(Proxy)
查看>>