文章目录
一、底层架构解密
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