c++ STL 之双向队列—— deque 详解

本文介绍了C++STL中的deque数据结构,它是一个双向队列,支持在两端进行高效的元素添加和删除。讲解了deque的实现原理,如何创建和使用deque,以及常见的操作如迭代器遍历、出入队、swap和insert/erase函数。
摘要由CSDN通过智能技术生成

deque 是 stl 的一个关联容器,名叫“双向队列”,何为“双向队列”?其实就是一个数组,但有了数组何必还需双向队列,这是一个高深的问题。

目录

一、简介

        1.字面意义

        2.实现

二、使用

        1. 创建 deque

 三、list 遍历

        1.iterator

        2.auto

四、函数 

        1.出入队

        2.swap

        3.insert

        4.erase

一、简介

        1.字面意义

    “de”  是 “double end” 的缩写,指双向,双端,“que” ,是 “queue” 指队列,所以顾名思义,“deque” 就是双向队列,可以双向入队,出队的队列,换句话说,就是可以在开头、结尾添加、减少元素的数组。

        2.实现

    deque 的实现,离不开 allocator ,即分配器,可以随意分配空间,使 deque 可以无限扩张,又不同于 new ,allocator 在前后可以均可扩张,时间负杂度只有 O(1) 。无需 copy 函数。实现在 <memory/alloctor.h> 头文件的 allocate 函数中:

_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
    _Tp* allocate(size_t __n) {
        if (__n > allocator_traits<allocator>::max_size(*this))
            __throw_length_error("allocator<T>::allocate(size_t n)"
                                 " 'n' exceeds maximum supported size");
        if (__libcpp_is_constant_evaluated()) {
            return static_cast<_Tp*>(::operator new(__n * sizeof(_Tp)));
        } else {
            return static_cast<_Tp*>(_VSTD::__libcpp_allocate(__n * sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp)));
        }
    }

二、使用

        1. 创建 deque

    首先引用 deque 头文件,使用 std 库:

#include <deque>
using namespace std;

    和一般模版类一样创建,1.类型,2.模版,3.变量名: 

deque< int> q;

 三、list 遍历

        1.iterator

    “iterator” 中文名为“迭代器”,访问方式如下: 

for(deque <int>::iterator it = s.begin();it != s.end();++ it)
{
    cout << *it;
}

        2.auto

     c++11 以后,新增了一种 for 循环语法(如下), vector、list 等容器也可以这么访问: 

for (auto i : v)
{
        
}

四、函数 

        1.出入队

    1.在开头入队:push_front(x);

    2.在开头出队:pop_front(x);

    3.在结尾入队:push_back(x);

    4.在结尾出队:pop_back(x);

        2.swap

    “swap” 交换两个 list ,只能用他的内置函数,不能使用直接定义在 std 库中的 swap,如下:

q.swap(temp);

        3.insert

    在一个指针插入一个元素:

d.insert(it,x);

        4.erase

    清除一个指针指向的元素:

d.erase(it);

你学会了吗? 

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值