C++学习笔记12 STL Deque
2017-09-08 21:20
190 查看
deque双端队列其实就是一个双端数组
deque是双端队列,它有vector没有的功能,push_front,在序列头部添加元素,它的底层设计也不同于vector,deque的底层是用间接索引的方式实现的,如下图所示:
开始的时候map是一个指针数组,里面存储着若干个指针,但初始的时候只有其中的一个指针有对应的值,比如是中间的一个指针,它指向内存中的堆中申请的一片连续的内存,这块内存大小一般是固定的(可能为512字节),此时有迭代器指针的头和尾指向当前位置。
当向deque中添加数据的时候,先看是那种添加方式,如果是push_back,那么就在这个连续的内存块当中添加对象数据;
如果是push_front,此时因为前面没有内存,所以此时就要申请一块新的连续的内存,并用map中已知指针前面的位置的那个指针指向这片内存,并在这块内存最后的一定大小的字节中存储数据,并修改迭代器的begin,如果是push_back,那么就直接在迭代器的end处添加元素,然后迭代器的end+1。
那么当删除元素的时候怎么办呢?当在首部或者尾部删除元素,此时很好办,直接让迭代器的头向前移动或者尾向后移动一下就可以了,此时效率很高,并且此时的修改并不会影响deque原有的迭代器,即在此之前的迭代器不会失效。
但如果在中间某个地方删除或者添加元素的时候可能就要考虑怎么移动的问题了,此时要判断要插入或者删除的位置离哪边近一些,然后就对近的那一段进行移动。
所以对于deque来说,中间删除或者添加元素也是代价很高的,但在开头和尾部删除和添加元素代价很少,另外由于deque是间接取元素,所以它的随机访问(operator[])的效率要比vector低一些。
deque是双端队列,它有vector没有的功能,push_front,在序列头部添加元素,它的底层设计也不同于vector,deque的底层是用间接索引的方式实现的,如下图所示:
开始的时候map是一个指针数组,里面存储着若干个指针,但初始的时候只有其中的一个指针有对应的值,比如是中间的一个指针,它指向内存中的堆中申请的一片连续的内存,这块内存大小一般是固定的(可能为512字节),此时有迭代器指针的头和尾指向当前位置。
当向deque中添加数据的时候,先看是那种添加方式,如果是push_back,那么就在这个连续的内存块当中添加对象数据;
如果是push_front,此时因为前面没有内存,所以此时就要申请一块新的连续的内存,并用map中已知指针前面的位置的那个指针指向这片内存,并在这块内存最后的一定大小的字节中存储数据,并修改迭代器的begin,如果是push_back,那么就直接在迭代器的end处添加元素,然后迭代器的end+1。
那么当删除元素的时候怎么办呢?当在首部或者尾部删除元素,此时很好办,直接让迭代器的头向前移动或者尾向后移动一下就可以了,此时效率很高,并且此时的修改并不会影响deque原有的迭代器,即在此之前的迭代器不会失效。
但如果在中间某个地方删除或者添加元素的时候可能就要考虑怎么移动的问题了,此时要判断要插入或者删除的位置离哪边近一些,然后就对近的那一段进行移动。
所以对于deque来说,中间删除或者添加元素也是代价很高的,但在开头和尾部删除和添加元素代价很少,另外由于deque是间接取元素,所以它的随机访问(operator[])的效率要比vector低一些。
相关文章推荐
- C++学习笔记12-模板1
- MySQL学习笔记_12_Linux下C++/C连接MySQL数据库(二) --返回数据的SQL
- C/C++学习笔记12:数组作为函数参数
- C++学习笔记12-模板1
- C++学习笔记12:类成员初始化等问题
- Effective C++ 学习笔记(12)
- 【菜鸟C++学习笔记】12.构造函数与析构函数
- C++学习笔记12 构造函数与析构函数下
- C++ FAQ学习笔记 12 章 赋值算符
- 【学习笔记】C++primer plus 10. 11. 12. 对象
- C++学习笔记 lesson12 继承
- c++ 学习笔记(高级linux编程) day12
- C++学习笔记12——函数的参数传递
- C++学习笔记(12)——多态与虚函数
- 【C++学习笔记】12_指针的定义与使用
- C++学习笔记12,protected继承,保护继承(三)
- 【C++】学习笔记草稿版12(类对象的类型转换)
- C++ 学习笔记(12)动态内存、智能指针、new和delete、动态数组、allocator
- C++学习笔记——第二章习题(四)-用循环语句打印图案
- effective C++ 学习笔记 (2010.1.29)