C++的基础知识(十)--deque
来源:互联网 发布:linux中安装anaconda 编辑:程序博客网 时间:2024/06/08 11:42
deque与vector非常相似。它也采用动态数组管理元素,提供随机存取,有着和vector几乎一样的接口。不同的是deque的动态数组头尾都开放,因此能在头尾两端进行快速安插和删除。
deque与vector的主要不同之处在于:
- 两端都能快速安插和删除元素,这些操作可以在分期摊还的常数时间(amortized constant time)内完成。
- 元素的存取和迭代器的动作比vector稍慢。
- 迭代器需要在不同区块间跳转,所以它非一般指针。
- 因为deque使用不止一块内存(而vector必须使用一块连续内存),所以deque的max_size()可能更大。
- 不支持对容量和内存重新分配时机的控制。不过deque的内存重分配优于vector,因为其内部结构显示,deque不必在内存重分配时复制所有元素。
- 除了头尾两端,在任何地方安插或删除元素,都将导致指向deque元素的所有pointers、references、iterators失效。
- deque的内存区块不再被使用时,会自动被释放。deque的内存大小是可自动缩减的。
- 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(随机存取迭代器)。
使用deque需注意:
1. 除了at( ),其它成员函数均不会检查索引或迭代器是否有效。
2. 任何插入或删除动作都会使所有指向deque元素的pointers、references、iteartors失效,唯一例外的是在头部或尾部插入元素(此时pointers和references仍然有效,但iterators失效)。
3. .vector还有一个不好的地方,当你往一个vector里添加一个成员的时候,所有指向这个vector的原来成员的指针就不能保证有效了,因为 vector会re-alloc内存.而deque不会,无论从前面还是后面添加新成员,旧的成员都不会移动位置,这一点有时候很有用
优先使用vector,还是deque?
c++标准建议:vector是那种应该在默认情况下使用的序列。如果大多数插入和删除操作发生在序列的头部或尾部时,应该选用deque。
阅读全文
0 0
- C++的基础知识(十)--deque
- C++deque的使用
- C语言基础知识之(十):结构体
- C语言基础知识之(二十):指针高级运用
- Objective-C 基础知识之(十): OC中的排序方法
- MakeFile基础知识(十)
- [C++]vector,list和deque的区别
- c++stl的deque(双端队列)
- C++STL学习(2)容器deque
- Oracle基础知识(十) - Having和distinct关键词的作用
- Java基础知识 十(Map集合的概述及案例)
- C语言的公共基础知识(3)
- C语言的公共基础知识(4)
- C语言的公共基础知识(5)
- C语言的基础知识整理(1)
- C语言的基础知识
- C语言的基础知识
- c~c++的基础知识
- DrawerLayout中菜单栏和主界面点击失效的原因
- bootstrap-star-rating使用详解
- mongoDB基础使用(二)
- Android App Logging 组件客制化
- Netty详细讲解
- C++的基础知识(十)--deque
- toryboard (<UIStoryboard: 0x17406dc00>) doesn't contain a view controller with identifier 'UIViewCon
- svn
- 特征选择之方法概述
- 集群/分布式环境下5种session处理策略
- bzoj2243: [SDOI2011]染色(树链剖分+线段树)
- HTML5 文件域+FileReader 分段读取文件并上传到服务器
- 字符与字节有什么区别
- react native mac下环境搭建