STL之deque容器

来源:互联网 发布:余佳文 知乎 编辑:程序博客网 时间:2024/05/29 09:38
deque容器:
应该是比vector和list要复杂得多的容器了,它与vector的区别主要有两点:
1)它类似于vector容器的连续,但是又不是完全连续,它利用一个中控单元实现假象的连续,中控单元中的每一个元素都管理者一个缓冲区(其实就是一个固定大小的数组);
2)但是在vector中当空间不足时,是需要重新分配一个新的空间,然后将现有的元素移动过去,然后销毁原来的空间,这个在deque中是不存在的;

结构描述:
deque使用了中控组织控制每个独立单元的形式,当deque初始为空的时候,它会先维护一个缓冲区(这个缓冲区一定是处于控制组织的最中心位置的,这样保证了向前
插入和向后插入的效率和空间一样大),假如说,现在规定一个deque<int,alloc,8>  dq(20,6),要求该容器初始情况为:元素类型为int型,每个缓冲区为容纳
8个int型变量的大小,该容器初始有20个元素,每个元素的值都是6;现在就会占用3个缓冲区(因为20个元素需要3个8才能容下),这时候STL会根据实际情况而定。
默认的情况是中控组织map中最少容量为8(也即可以指向8个缓冲区),很明显现在需要的是3个,比默认值小,所以会自动的将map数组的大小定为8。如果
比默认值打的话,就会将map数组的大小设置为(需要的节点数加2,前边后边各一个空余)。

插入元素:
包括前向插入和后向插入,在插入元素的过程中,如果map中没有空间了,也会根据实际情况来判断
①:如果在前向插入,map中的第一个节点所指向的缓冲区中剩下两个及以上的空间,则会直接插入该位置;如果map中的第一个节点所指向的缓冲区中只剩下一个空间,
则会使用A_before函数进行判断;
②:后向插入和前向一样的道理;
现在介绍一下A_before函数的原理,如果是前向插入,就计算出当前总共使用的map节点数A,如果A满足:2*A < mapsize,则将现在使用的节点向后移动即可,
意思是只移动map数组中的节点就好了;如果不满足,则重新配置一个空间用于存放map数组(也即使map数组变大),空间的大小等于max(A,mapsize)+2;
然后拷贝map数组到新的位置即可,并将原来的map数组销毁;


迭代器:
这里注意,每个迭代器存放了四个内容,即:迭代器“当前所指的缓冲区的first起始位置”,“和当前所指的缓冲区的last结束位置”,
“迭代器在该缓冲区中所指的具体位置”‘以及“迭代器所指的缓冲区在map中的位置”;
因为结构的复杂性,又必须满足STL中该有的迭代器操作(包括解引用和->,++,--),所以这种容器的迭代器是比较复杂的,在迭代器前进的过程中,
如果迭代器已经到达该缓冲区的最后last位置,则应该跳到下一个map节点位置的first位置,如果是后退的话也是一样的道理;

元素操作:
pop_back函数如果在执行后盖缓冲区没有数据,则销毁该缓冲区,并且将容器的end指针设为前一个缓冲区的last位置;
同样的pop_front函数一样的道理:在执行插入元素的时候,会先判断在插入位置之前的元素个数numBefore和插入点之后的元素个数numAfter,
如果numBefore小于numAfter,则将前边的元素向前移动一格,否则将后边的元素向后移动一格;clear操作同样会将容器设置为只有一个缓冲区的原始状态;
erase函数也是可能会伴随着缓冲区的释放进行的;
0 0
原创粉丝点击