C++,STL容器 deque:双端队列的深度解析

请添加图片描述


一、底层架构解密

1.1 革命性存储结构

C++ STL deque采用分块数组+索引表的复合结构,完美平衡连续内存的访问效率与动态扩展的灵活性:

// 典型实现结构(简化)
template<class T>
class deque {
   
private:
    T** map;               // 索引表指针数组
    size_t map_size;       // 索引表容量
    iterator start;        // 首元素迭代器
    iterator finish;       // 末元素迭代器
    size_t block_size;     // 单块容量(通常512B~4KB)
};

内存布局ASCII示意图:

索引表
┌──────┬──────┬──────┐
| 0x100| 0x200| 0x300| → 内存块地址
└──────┴──────┴──────┘
   │       │       │
   ▼       ▼       ▼
┌──────┐ ┌──────┐ ┌──────┐
│      │ │      │ │      │ → 内存块(固定大小)
└──────┘ └──────┘ └──────┘
  ▲             ▲
  │             │
start迭代器    finish迭代器

1.2 动态扩容机制

当首尾空间不足时,deque采用几何级数扩容策略:

  • 头部插入时优先使用预留空间
  • 索引表满时扩容至原大小2倍
  • 内存块按需分配,避免整体搬迁
// 扩容过程示例
void push_front(const T& value) {
   
    if (start.cur != start.first) {
     // 当前块有空位
        --start.cur;
        *start.cur = value;
    } else {
   
        if (start.node == map) {
        // 需要扩展索引表
            reallocate_map(true);    // 头部扩容
        }
        --start.node;                // 跳转到新块
        start.cur = *start.node + block_size - 1;
        *start.cur = value;
    }
}

二、核心操作实践

2.1 基础操作示例

#include <deque>

// 初始化技巧
std::deque<int> dq1(5, 100);          // 5个100
std::deque<std::string> dq2{
   "A", "B", "C"};

// 高效插入操作
dq1.emplace_front(2023);             // 避免临时对象
dq2.insert(dq2.begin() + 1, "X");    // 中间插入O(n)

// 元素访问对比
cout << dq1[2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智驾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值