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

C++之queue类的代码及其逻辑详解

1. queue介绍及使用方法

queue 是 C++ 标准模板库(STL)中的容器适配器,遵循先进先出(FIFO)原则。它基于其他容器(如 deque 或 list)实现,仅允许在队尾插入元素,在队头删除元素。

stack的底层是一个 deque<T>(双端队列),虽然deque是可以从两端来进行操作的,但是我们只要只提供一端的接口,那么就可以来把它当做stack来使用。

因为queue需要支持高效的 “队尾插入”(push)和 “队头删除”(pop)操作,而dequepush_back(尾插)和pop_front(头删)操作均能在常数时间内完成,且无需像vector那样在头删时移动大量元素,也无需像list那样维护额外的指针开销,综合性能更优。

2. queue的常用函数

函数名函数作用
void push(const T& x)在尾巴部插入元素
void pop()抛出一个头部元素
T& front()返回头部元素
T& back()返回尾部元素
size_t size()返回队列的大小
bool empty()判断是否为空,为空就返回true

3. template

在这里写两个calss是为了方便使用,这两个模板参数实际上是各司其职,只是语法上要求写在同一个 template<> 里,使用时会根据场景自动匹配对应的参数。

  • 前面的 T 是明确指定栈中元素的类型(比如 intstring 等),这是栈对外提供的 “数据类型契约”—— 栈里只能存 T 类型的东西。
  • 后面的 Container 是指定用什么容器来存储这些 T 类型的元素,而默认的 deque<T> 就是 “用双端队列来存 T 类型元素” 的意思。

PS:只写后面那一个理论上来说也是可以的,但是会让用户使用门槛变高,比如想声明一个存 int 的栈,用户不能直接写 stack<int>,而必须写成 stack<deque<int>>(如果想用默认容器),或者 stack<vector<int>>。这会让接口变得不直观 —— 用户需要先知道底层容器的类型,才能正确声明栈,违背了 “栈是容器适配器,用户无需关心底层实现” 的设计初衷。

PS:只写前面哪一个是不行的,如果只写 template<class T>,就意味着用户无法指定底层容器了 —— 因为没有 Container 这个参数来接收用户自定义的容器类型。

template<class T, class Container = deque<T>>

4. private

这就是申明一个私有成员_con。

private:Container _con;

5.pop()

抛出队头,因为队列是先进先出的。

void pop()
{_con.pop_front();
}

6. front()

返回队头元素。

PS:这边使用T&是为了调用者可以直接修改队列中真正的队头元素,避免不必要的拷贝开销。

T& front()
{return _con.front();
}

7. back()

返回队尾元素。

队列是先进先出,但是在很多场景下,除了需要知道 “最早入队的元素”(队头,front()),还可能需要获取 “最新入队的元素”(队尾)。

back()只是“读取” 队尾元素,不会修改队列的结构或元素顺序,因此不会破坏其核心逻辑。

T& back()
{return _con.back();
}

8. size()

通过调用双端队列的size()来返回队列size的大小。

size_t size()
{return _con.size();
}

9. empty()

判断是否为空,为空就返回true。

bool empty()
{return _con.empty();
}

10. push()

在队列尾部插入一个元素。

void push(const T& x)
{_con.push_back(x);
}

11. 总结

综上,queue凭借简洁的接口、高效的底层实现,成为处理顺序依赖场景的理想选择。理解其基于deque的适配逻辑,能帮助开发者更合理地运用队列解决实际问题。

以下是queue的完整代码:

template<class T, class Container = deque<T>>class queue{public:void push(const T& x){_con.push_back(x);}void pop(){_con.pop_front();//_con.erase(_con.begin());}T& front(){return _con.front();}T& back(){return _con.back();}size_t size(){return _con.size();}bool empty(){return _con.empty();}private:Container _con;};


文章转载自:

http://3tu413Cl.jfwbr.cn
http://NBKtCBbv.jfwbr.cn
http://2O2DJTVB.jfwbr.cn
http://h0b4qwd1.jfwbr.cn
http://AsK8XUT3.jfwbr.cn
http://xwVqrImF.jfwbr.cn
http://fjE2iUbM.jfwbr.cn
http://y68fxYm1.jfwbr.cn
http://aE6hSRDc.jfwbr.cn
http://QzWxlN8H.jfwbr.cn
http://YHF2FLmg.jfwbr.cn
http://6fGtwVeN.jfwbr.cn
http://gvvwAQmE.jfwbr.cn
http://Pxhk83lD.jfwbr.cn
http://J1HeqL8q.jfwbr.cn
http://7E1rBvSn.jfwbr.cn
http://xj6MMXyD.jfwbr.cn
http://uATgpTSX.jfwbr.cn
http://izK1c5jj.jfwbr.cn
http://G5YdC6Cd.jfwbr.cn
http://oKYhduvy.jfwbr.cn
http://Oy1Gcsem.jfwbr.cn
http://v6f46tCV.jfwbr.cn
http://PZdP96e6.jfwbr.cn
http://M1GdmZQf.jfwbr.cn
http://mcn2YRay.jfwbr.cn
http://EeGxDkf0.jfwbr.cn
http://zHLrOnJ5.jfwbr.cn
http://UoyKFJjB.jfwbr.cn
http://SuV1EeDa.jfwbr.cn
http://www.dtcms.com/a/372800.html

相关文章:

  • 36.Java序列化与反序列化是什么
  • 进阶向:HTTP性能优化实战
  • 对计算机网络模型的理解
  • 【Linux】MySQL数据目录迁移步骤(含流程图踩坑经验)
  • LangChain: Evaluation(评估)
  • 在电路浪涌测试中,TVS(瞬态电压抑制二极管)的防护效果确实会受到陪测设备中去耦网络(Decoupling Network,DN)的显著影响
  • 深入了解linux系统—— 日志
  • 3D开发工具HOOPS助力造船业数字化转型,打造更高效、更智能的船舶设计与协作!
  • 大语言模型时代文本水印技术的综述解读
  • 《WINDOWS 环境下32位汇编语言程序设计》第13章 过程控制(2)
  • 1. 统计推断-基于神经网络与Langevin扩散的自适应潜变量建模与优化
  • STM32U575RIT6 简单代码(参考模板)
  • 在新发布的AI论文中 pytorch 和tensorflow 的使用比例
  • Chapter3—单例模式
  • k8s可视化的解决方案及技术选型
  • K8s Ingress Annotations参数使用指南
  • Kubernetes(K8S)入门以及命令指南
  • 自建prometheus监控腾讯云k8s集群
  • Go 1.25在性能方面做了哪些提升?
  • Next.js数据获取入门:`getStaticProps` 与 `getServerSideProps`
  • 为什么要在出口路由器router配置NAT与默认路由
  • 如何 正确使用 nrm 工具 管理镜像源
  • http response的工作流程详细解析
  • FastDFS(分布式RPC调用和分布式文件储存)
  • 国内开源时序数据库IoTDB介绍
  • TCL电视机音乐播放器动效背景模仿
  • 深入解析:Vue与React的异步批处理更新机制
  • 基于Spring Boot的火灾报警系统的设计与实现(代码+数据库+LW)
  • Spring Boot的配置文件加载顺序和规则
  • B.30.10.05-JVM电商实战应用