STL——deque

发布于:2024-05-07 ⋅ 阅读:(15) ⋅ 点赞:(0)

双端队列,可以对头端进行插入删除操作

记录一个常遇到的问题

deque subscript out of range 使用了还未定义的空间,大概率是没有初始化就使用了下标或者其他方式进行数据访问。

与vector区别

  • 内部实现方式:deque采用了分段连续存储的方式,由多个连续的存储块组成,每个存储块都是独立分配的,并且可以动态增长或缩小,而vector使用单个连续的存储块;

  • 插入和删除操作效率:deque在两端进行插入和删除的效率很高,时间复杂度为O(1),而vector则需要移动后续元素,时间复杂度为O(n)

  • 访问元素效率:deque存储块分段,故随机访问的效率比vector低。

构造函数

  • deque<T> deqT; //默认构造方式

  • deque(beg,end); //构造函数将[beg, end)区间中的元素拷贝给本身。

  • deque(n,ell); //构造函数将n个elem拷贝给本身。

  • deque(const deque &deq); //拷贝构造函数

操作与vector几乎一致

赋值操作

  • deque& operator=(const deque &deq); //重载等号操作符

  • assign(beg,end); //将[beg, end)区间中的数据拷贝赋值给本身。

  • assign(n,ele); //将n个elem拷贝赋值给本身。

操作与vector几乎一致

大小操作

  • deque.empty() //判空

  • deque.size() //返回元素个数

  • deque.resize(num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。

//如果容器变短,则末尾超出容器长度的元素被删除。

  • deque.resize(num,ele); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。

//如果容器变短,则末尾超出容器长度的元素被删除。

deque没有容量的概念

插入删除

  • 两端操作

    • push_back(ele);

    • pop_back();

    • push_front(ele);

    • pop_front();

  • 指定位置操作

    • insert(pos,elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置。

    • insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值。

    • insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值。

    • clear(); //清空容器的所有数据

    • erase(beg,end); //删除[beg,end)区间的数据,返回下一个数据的位置。

    • erase(pos); //删除pos位置的数据,返回下一个数据的位置。

注意,pos指的是迭代器

数据存取

  • at(int idx); //返回索引idx所指的数据

  • front(); //返回容器中第一个数据元素

  • back(); //返回容器中最后一个数据元素

sort(iterator beg,iterator end); //对beg和end区间内元素进行排序