当前位置: 首页 > web >正文

C++STL之deque

概念:本质是一个指针数组 并且 deque数据的添加是没有内存移动的


deque对象创建

#include <iostream>
#include <deque>
using namespace std;// 辅助函数:打印deque内容
template<typename T>
void printDeque(const deque<T>& d) {for (const auto& elem : d) {cout << elem << " ";}cout << endl;
}int main() {// 1. 默认构造函数deque<int> d1;cout << "d1: ";printDeque(d1);  // 输出空// 2. 初始化列表deque<int> d2_1({9, 8, 8, 6, 5});cout << "d2_1: ";printDeque(d2_1);  // 9 8 8 6 5deque<int> d2_2 = {1, 8, 8, 8, 5};cout << "d2_2: ";printDeque(d2_2);  // 1 8 8 8 5// 3. 迭代器范围初始化deque<int> d3(d2_1.begin() + 1, d2_1.end() - 1);cout << "d3: ";printDeque(d3);  // 8 8 6// 4. 全0初始化(指定元素数量)deque<int> d4(10);cout << "d4: ";printDeque(d4);  // 0 0 0 0 0 0 0 0 0 0// 5. 固定值初始化(数量+值)deque<int> d5(8, 6);cout << "d5: ";printDeque(d5);  // 6 6 6 6 6 6 6 6// 6. 拷贝构造函数deque<int> d6(d5);cout << "d6: ";printDeque(d6);  // 6 6 6 6 6 6 6 6return 0;
}


deque 赋值操作

#include <iostream>
#include <deque>using namespace std;void printDeque(deque<int>& d) {for (deque<int>::iterator iter = d.begin(); iter != d.end(); iter++) {cout << *iter << " ";}cout << endl;
}int main() {deque<int> d = {9, 8, 5, 2, 1, 1};cout << "d: ";printDeque(d);// 1. = 赋值deque<int> d1;d1 = d;cout << "d1: ";printDeque(d1);// 2. assign(迭代器)deque<int> d2;d2.assign(d1.begin() + 1, d1.end());cout << "d2: ";printDeque(d2);// 3. 初始化列表deque<int> d3;d3.assign({1, 2, 3, 5, 6, 7});cout << "d3: ";printDeque(d3);// 4. 初始化 a 个 bdeque<int> d4;d4.assign(8, 6);cout << "d4: ";printDeque(d4);return 0;
}

deque 大小操作

#include <iostream>
#include <deque>using namespace std;// 用于打印双端队列元素的函数
void printDeque(deque<int>& d) {for (int i = 0; i < d.size(); ++i) {cout << d[i] << " ";}cout << endl;
}int main() {deque<int> d;// 检查初始状态下双端队列是否为空以及大小cout << "d.empty() = " << d.empty() << endl;cout << "d.size() = " << d.size() << endl;// 使用初始化列表为双端队列赋值d.assign({1, 2, 3});// 再次检查双端队列是否为空以及大小,并打印元素cout << "d.empty() = " << d.empty() << endl;cout << "d.size() = " << d.size() << endl;printDeque(d);// 将双端队列大小调整为18d.resize(18);cout << "d.size() = " << d.size() << endl;printDeque(d);// 将双端队列大小调整为20,新增元素值为6d.resize(20, 6);cout << "d.size() = " << d.size() << endl;printDeque(d);// 将双端队列大小调整为10000d.resize(10000);cout << "d.size() = " << d.size() << endl;printDeque(d);// 将双端队列大小调整为5d.resize(5);cout << "d.size() = " << d.size() << endl;printDeque(d);return 0;
}

结果


deque 数据插入

#include <iostream>
#include <deque>using namespace std;// 打印双端队列元素的函数
void printDeque(deque<int>& d) {for (deque<int>::iterator iter = d.begin(); iter != d.end(); iter++) {cout << *iter << " ";}cout << endl;
}int main() {deque<int> d;// 1. push_frontd.push_front(-1);d.push_front(-2);d.push_front(-3);// 此时双端队列d:-3 -2 -1printDeque(d); // 2. push_backd.push_back(1);d.push_back(2);d.push_back(3);// 此时双端队列d:-3 -2 -1 1 2 3printDeque(d); // 3. insert// 在迭代器指向位置前插入元素0,位置为d.begin() + 3,即原第4个元素前d.insert(d.begin() + 3, 0); // 此时双端队列d:-3 -2 -1 0 1 2 3printDeque(d); // 在迭代器指向位置前插入元素1,位置为d.end() - 1,即原倒数第2个元素前d.insert(d.end() - 1, 1); // 此时双端队列d:-3 -2 -1 0 1 2 1 3printDeque(d); // 在迭代器指向位置前插入[first, last)范围内的元素,first为d.begin() + 4 ,last为d.begin() + 6d.insert(d.begin() + 1, d.begin() + 4, d.begin() + 6); // 假设原双端队列d:-3 -2 -1 0 1 2 1 3  插入后:-3 1 2 -2 -1 0 1 2 1 3printDeque(d); return 0;
}

#include <iostream>
#include <deque>// 假设的打印函数,用于输出双端队列元素
void printDeque(const std::deque<int>& d) {for (int num : d) {std::cout << num << " ";}std::cout << std::endl;
}int main() {std::deque<int> d = {-1, 9, 8, 5, 5, 2, 1, 1, -1};printDeque(d);d.pop_back();printDeque(d);d.pop_front();printDeque(d);std::deque<int>::iterator it = d.erase(d.begin() + 2);// 9 8 2 1 1printDeque(d);std::cout << *it << std::endl;it = d.erase(it);// 9 8 1 1printDeque(d);std::cout << *it << std::endl;d.erase(d.begin() + 1, d.begin() + 3);printDeque(d);d.clear();printDeque(d);std::cout << "d.empty() = " << d.empty() << std::endl;std::cout << "d.size() = " << d.size() << std::endl;return 0;
}

deque 扩容机制.

deque的物理结构本质其实是 指针数组 每一个指针都指向一块连续的内存 数据从头开始存入

当第一块内存存储满了之后 想继续push_frort()时 那么数据会存储在末尾 当数据即将溢出时会继续扩容

 

底层原代码


deque 随机访问

#include <iostream>
#include <deque>
using namespace std;int main() {deque<int> d = { 9, 8, 7, 6, 5 };cout << d[2] << endl;cout << d.at(2) << endl;cout << d.front() << endl;cout << d.back() << endl;return 0;
}

http://www.xdnf.cn/news/9406.html

相关文章:

  • 文件类型汇总
  • 机动与灵活的水上救援利器,冲锋舟
  • 深度解析 CC 攻击:原理、危害与防御策略​
  • C++将地址转换为字符串
  • 双特异性抗体的设计与开发
  • Java SapringBoot集成Redis存储Session,setAttribute会重置过期时间吗?怎么实现更新过期时间
  • Soft thinking和MixtureofInputs——大模型隐空间推理——本周论文速读
  • apk- 反编译apktools操作方法——请勿乱用-东方仙盟
  • Opigno LMS 3.2.7 安装操作记录
  • 32通道采集收发平台18G带宽直采
  • lcd-framebuffer驱动开发参考文章
  • 更新时间相差8个小时
  • Word 目录自动换行后错位与页码对齐问题解决教程
  • 某验4无感探针-js逆向
  • fabric 是一个开源框架,用于使用 AI 增强人类能力。它提供了一个模块化框架,用于使用一组可在任何地方使用的众包人工智能提示来解决特定问题
  • 仿真环境中机器人抓取与操作——感知与抓取
  • 通过实例来讲解MySQL锁机制
  • 智能的结构化觉醒:GraphRAG引领AI进入关系世界
  • JDK21深度解密 Day 6:ZGC与内存管理进化
  • Flink Table API 编程入门实践
  • 使用子查询在 SQL Server 中进行数据操作
  • 触觉智能RK3506星闪开发板规格书 型号IDO-EVB3506-V1
  • 如何在sublime text中批量为每一行开头或者结尾添加删除指定内容
  • 计算机系统结构-第4章-数据级并行
  • 五大要素协同效益的量化模型与实战策略
  • 企业宣传网站系统项目
  • Unity3D仿星露谷物语开发54之退出菜单及创建可执行文件
  • 视频监控联网系统GB28181协议中历史视音频的回放流程详解以及查询失败常见原因
  • Python PyMySQL
  • 为什么共现矩阵是高维稀疏的