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

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;
}

相关文章:

  • Halcon 霍夫变换
  • 计算机科技笔记: 容错计算机设计05 n模冗余系统 特殊的双模系统 复杂结构 非并行串行结构的两种计算方法
  • 数据结构测试模拟题(2)
  • 开源即战力!从科研到商用:Hello Robot 移动操作机器人Stretch 3多模态传感融合(RGB-D/激光/力矩)控制方案
  • 5月27日复盘-Transformer介绍
  • ASP.NET Core 中JWT的基本使用
  • 第二章:软盘里的90年代
  • 解析pod
  • leetcode hot100刷题日记——20.爬楼梯
  • 为什么MCP可以适配不同LLM
  • AtCoder 第407场初级竞赛 A~E题解
  • droidcam ivcam 电脑访问不到地址解决办法 把网线从猫插到路由上
  • AStar低代码平台-脚本调用C#方法
  • OpenHarmony定制系统组合按键(一)
  • QML常用窗口和菜单
  • PPO算法里clipfrac变量的作用
  • Java 各版本核心新特性的详细说明
  • cuda ncu section 含义解释
  • ai客服平台哪家好:AnKo多模型AI聚合时代!
  • 图像分割全路线学习(结合论文)
  • 骏域网站/百度推广销售员的工作内容
  • 公司网站制作费计入会计什么科目/泉州seo优化
  • 有利于seo的网站底部/西安网站seo技术
  • 自己做soho需要做网站吗/北京seo助理
  • 网站开发者账号购买/郑州网络seo
  • 巩义网站建设方式优化/宁波seo网络推广公司排名