深度探索 deque, queue, stack
声明:本文中所有图件都来自B站侯捷老师授课视频
deque
deque 的实现
- deque 的内存空间既可以向前扩张,又可以向后扩张。它的实现办法核心思想是,有一个内存控制中心(如图 1 中的 map),这个控制中心存储了一些内存地址,每个地址指向一个 buffer(连续空间),暂时视为一个 buffer 可以容纳 8 个元素(如图1,其实可以容纳的元素数量为 512 / 元素大小 )。只要在迭代器上做手脚,使得从 buffer 的端点可以平滑跨到相邻 buffer 的端点,就可以造成 deque 内存空间连续的 假象。
- 保存 buffer 地址的控制中心 实际上是 vector ,元素类型是 指针,每次都会把指针放在 vector 的中间位置,比如 vector 容积为8,放两个指针就放在 第4,5个位置,如果deque不断添加元素,导致 控制中心的指针数量即将从 8 增加到9(或者vector前面没有空间了),就会另外分配一个容积为 16 的内存空间,然后把原来的 9 个指针放在这16个位置vector的中间位置。
图1. deque 的 实现原理图
图2. deque 的实现代码
deque 的迭代器 与 insert
图3. deque 的迭代器的成员变量
图4. deque 的 insert 函数实现
deque 如何模拟连续空间(全靠迭代器)
图5. deque 模拟连续空间—迭代器操作符重载1
图6. deque 模拟连续空间—迭代器操作符重载(*, &, 迭代器之间的减法)
图7. deque 模拟连续空间—迭代器操作符重载(自增,自减)
图8. deque 模拟连续空间—迭代器操作符重载(相加后赋值,加上一个有符号整型数)
图9. deque 模拟连续空间—迭代器操作符重载(相减后赋值,减去一个有符号整型数)
deque 在 GNU4.9的实现
图10. deque 的实现(GNU4.9)
图11. deque 的内存管理示意图(GNU4.9)
queue 和 stack
queue 的实现
图12. queue 实现代码
stack 的实现
图13. stack 实现代码
queue 和 stack 的使用注意