deque:双端队列。和vector容器一样同属于STL中的序列式容器,相较vector容器的尾部操作,多提供了头部的快速插入和删除操作。deque的特点如下:
1、deque提供双端元素的插入和删除操作,逻辑结构是一个双端扩充的连续数组。物理结构上是由多块离散式连续存储空间(buffer)组成,由一个叫做map的数据结构存储这些buffer的地址,当deque需要扩容时,便申请一块新的buffer,将地址加入到map中即可。
2、提供双向随机访问迭代器:deque迭代器是一个智能指针,包含4个私有成员变量,分别是cur、first、last、node。cur指向当前访问元素,first指向当前访问元素所在buffer的首地址,last指向当前访问元素所在buffer的最后一个元素位置,node指向当前访问元素所在结点(封装了buffer)
3、deque底层由中控器(map结构)管理,在物理存储层面实现动态扩展。当一个缓冲区满时,中控器会自动为其分配一个新的缓冲区,并将所有元素从旧缓冲区复制到新缓冲区。同样地,当需要释放内存时,中控器会自动回收不再使用的缓冲区。这样的结构也就决定了deque没有capacity的概念。
总的来说,deque的中控器是一个高效的数据结构,它通过使用map来维护缓冲区的位置信息,使得deque可以在头部和尾部进行高效的插入和删除操作。这种设计使得deque成为在需要频繁进行前后端操作的应用中的理想选择。
deque
deque
deque
deque
deque
T& deque
T& deque
T& deque
T& deque
相较vector,新增了头插和头删函数
void deque
void deque
void deque
void deque
void deque
void deque
deque双端队列没有容量的概念,但有可容纳最大元素数量,这个数量是由系统决定的
size_t deque
bool deque
size_t deque
deque
deque
deque
移动赋值和移动构造函数一样,需要将参数通过move()函数转换为右值引用,本质上类似于浅拷贝,但在浅拷贝的过程中,解除了原有对象other对资源的所有权和控制权,移交给了当前容器。移动语义技术出现在c++11及以后版本,处理大量数据或资源密集型对象时,避免了大量赋值操作,优化程序性能
1、越界风险。当使用下标运算符[],下标超出范围,index>size()时,行为是未定义的。at()不会存在此风险;下标越界时,at()会抛出out_of_range的异常提示。
2、迭代器失效。当容器添加或删除元素时会导致部分迭代器或者指针失效,特别是储存空间重新分配时,所有迭代器和指针都会失效。
3、内存管理。deque的内存管理比vector更复杂,当插入和删除元素时都有可能重新分配储存空间。deque能够自动释放空闲内存。
4、操作性能。deque提供双端插入或删除操作,但是从中间插入或者删除操作时,性能下降。