cpp►STL容器->序列容器->deque

Posted itzyjr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cpp►STL容器->序列容器->deque相关的知识,希望对你有一定的参考价值。

描述

std::deque
template <class T, class Alloc = allocator<T>> class deque;
deque=double + ended + queue.
双端队列是具有动态大小的序列容器,可以在两端(前端或后端)展开或收缩。

特定的库可能以不同的方式实现deques,通常作为某种形式的动态数组。但在任何情况下,它们都允许通过随机访问迭代器直接访问单个元素,并根据需要通过扩展和收缩容器来自动处理存储。

因此,它们提供了类似于vectors的功能,但是在序列的开头,而不仅仅是在序列的结尾,可以有效地插入和删除元素。但是,与vector不同,deque不能保证将其所有元素存储在相邻的存储位置:通过偏移指向另一个元素的指针来访问deque中的元素会导致未定义的行为。

vectors和deques都提供了一个非常相似的接口,可以用于类似的目的,但在内部,它们的工作方式都完全不同:vector使用单个数组,需要偶尔重新分配以进行增长,deque的元素可以分散在不同的存储块中,容器在内部保存必要的信息,以便在恒定时间内提供对其任何元素的直接访问,并具有统一的顺序接口(通过迭代器)。因此,deque在内部要比vector复杂一点,但这使得它在某些情况下能够更有效地增长,特别是对于非常长的序列,在这种情况下,重新分配变得更昂贵。

对于涉及除开始或结束位置以外的元素的频繁插入或删除操作,deque的性能更差,迭代器和引用的一致性不如list和forward_list。

容器属性(Container properties)
  • Sequence
    序列容器中的元素按严格的线性序列排序。单个元素通过其在此序列中的位置进行访问。
  • Dynamic array
    通常作为动态数组实现,它允许直接访问序列中的任何元素,并在序列的开始或结束时提供相对快速的元素添加/移除。
  • Allocator-aware
    容器使用分配器对象动态处理其存储需求。
// constructing deques
#include <iostream>
#include <deque>
int main() {
    unsigned int i;
    std::deque<int> first;// empty deque of ints
    std::deque<int> second(4, 100);// 4 ints with value 100
    std::deque<int> third(second.begin(), second.end());// iterating through second
    std::deque<int> fourth(third);// a copy of third
    // the iterator constructor can be used to copy arrays:
    int myints[] = { 16,2,77,29 };
    std::deque<int> fifth(myints, myints + sizeof(myints) / sizeof(int));

    std::cout << "The contents of fifth are:";
    for (std::deque<int>::iterator it = fifth.begin(); it != fifth.end(); ++it)
        std::cout << ' ' << *it;
    return 0;
}
The contents of fifth are: 16 2 77 29

以上是关于cpp►STL容器->序列容器->deque的主要内容,如果未能解决你的问题,请参考以下文章

STL之序列容器deque

STL中vector,list,deque和map的区别

STL 源码剖析读书笔记四:序列式容器之 dequestackqueue

STL容器:deque双端队列学习

cpp的stl有linklist吗

cpp►STL容器->序列容器->list