STL-deque

1.    Deque(双向开口的队列)

【1】    deque的迭代器也是class,它里面有四个元素:cur,first,last,node(指向控制中心)first指向buffer的头部,last指向buffer的尾部,deque是分段连续的,当迭代器走到边界,他有能力走到下一个缓冲区,cur指向的是当前的元素,node指向的是控制中心,在一个缓冲区内,first和last是不发生变化的,为什么deque是分段连续的,因为他在缓冲区(buffer)是连续的

【2】    deque的实现原理

(1)    deque采用一块所谓的map(注意,不是stl的map容器)作为主控,这里所谓map是一小块连续空间,其中每个元素(此处称为一个节点,node)都是指针,指向另一段(较大的)连续线性空间,称为缓冲区。缓冲区才是deque的存储空间主体,我们指定缓冲区的大小,默认值0表示将使用512bytes缓冲区

(2)    deque的整体框架

(3)    deque的迭代器

在deque迭代器中定义:当前元素的指针(cur),当前元素所在的缓冲区的起始指针(first),当前元素素在的缓冲区的尾指针(last)指向map中指向缓冲区地址的指针(node)

如果deque想要向后扩充,那么map中的指针向后移动,如果deque想要向前扩充,那么map中的指针向前移动。所有的容器都提供两个迭代器begin()和end(),在deque中一个迭代器的大小为16(即四个指针的大小),创建一个对象在deque中需要40个字节(start+finish+map+map_size)

【3】    说说std::deque的底层机制

Deque动态的,以分段的连续空间组合而成,随时可以增加一段新的连续空间,并连接起来,不提供空间保留功能。注意:除非必要我们尽可能的选择vector,而非deque,因为deque的迭代器要比vector的复杂的多,对deque排序,为了提高效率,可先将deque复制到一个vector上进行排序然后再讲排好序的结果复制给deque。Deque采用一块map作为主控,其中map为一小块连续空间,map中的每个元素都是指针,每个指针指向另一块较大的连续空间(缓冲区)

【4】    Deque的[]操作符复杂吗,为什么是O(1)

Deque要求在开头或末尾插入,删除元素的时间复杂度为O(1),随机访问的时间复杂度为O(1)


猜你喜欢

转载自blog.csdn.net/m0_37947204/article/details/80134547