除了标准的顺序容器外,STL还提供了3种容器适配器,queue,priority_queue和stack

适配器是对顺序容器的包装,它的作用是简化接口.

queue接口十分的简单,只有8个方法。再加上构造函数和比较运算符,push()和emplace()

在queue末尾添加元素。Pop()从头部移除元素。通过front()和back()可以返回头部和尾部元素的引用;切记:pop()不会返回一个元素的副本,如果需要这个pop()的元素,这在之前调用front()方法;

在PacketBuffer.h文件里:

  1. #ifndef QUEUE_PACKETBUFFER_H
  2. #define QUEUE_PACKETBUFFER_H
  3.  
  4. #include <queue>
  5. template<typename T>
  6. class PacketBuffer
  7. {
  8. public:
  9. PacketBuffer(int maxSize = );
  10. bool packetBuffer(const T& packet);
  11. T getNextPacket();
  12.  
  13. private:
  14. std::queue<T> mPackets;
  15. int mMaxSize;
  16. };
  17.  
  18. #endif //QUEUE_PACKETBUFFER_H

在PacketBuffer.cpp文件里:

  1. //
  2. // Created by Administrator on 2019/2/18.
  3. //
  4.  
  5. #include <stdexcept>
  6. #include "PacketBuffer.h"
  7.  
  8. template<typename T>
  9. PacketBuffer<T>::PacketBuffer(int maxSize)
  10. :mMaxSize(maxSize)
  11. {
  12.  
  13. }
  14. template<typename T>
  15. bool PacketBuffer<T>::packetBuffer(const T& packet)
  16. {
  17. if(mMaxSize > && mPackets.size() == mMaxSize)
  18. {
  19. return false;
  20. }
  21. mPackets.push(packet);
  22. return true;
  23. }
  24. template<typename T>
  25. T PacketBuffer<T>::getNextPacket()
  26. {
  27. if(mPackets.empty())
  28. {
  29. throw std::out_of_range("packet is empty\r\n");
  30. }
  31. T temp = mPackets.front();
  32. mPackets.pop();
  33. return temp;
  34. }

在main里:

  1. #include <iostream>
  2. #include "PacketBuffer.h"
  3. #include "PacketBuffer.cpp"
  4. class IPPacket
  5. {
  6. public:
  7. IPPacket(int id)
  8. :mId(id)
  9. {
  10.  
  11. }
  12. int getId()
  13. {
  14. return mId;
  15. }
  16.  
  17. private:
  18. int mId;
  19. };
  20.  
  21. int main()
  22. {
  23. PacketBuffer<IPPacket> packet();
  24. for(int i = ;i <= ;++i)
  25. {
  26. if(!packet.packetBuffer(IPPacket(i)))
  27. {
  28. std::cout << "Packet " << i << " dropped (queue is full)" << std::endl;
  29. }
  30.  
  31. }
  32. while(true)
  33. {
  34.  
  35. try
  36. {
  37. IPPacket ipage = packet.getNextPacket();
  38. std::cout << "id :" << ipage.getId() << std::endl;
  39.  
  40. }catch (const std::out_of_range&)
  41. {
  42. std::cout << "out of range!" << std::endl;
  43. break;
  44. }
  45. }
  46. return ;
  47. }

结果是:

Packet 4 dropped (queue is full)
id :1
id :2
id :3
out of range!

容器适配器(一):queue的更多相关文章

  1. STL容器适配器 stack, queue

    stack是一种后进先出(last in first out)的数据结构.它只有一个出口,如图所示.stack允许新增元素,删除元素,取得最顶端元素.但除了最顶端外,没有其他任何地方可以存储stack ...

  2. 容器适配器(stack、 queue 、priority_queue)源码浅析与使用示例

    一.容器适配器 stack queue priority_queue stack.queue.priority_queue 都不支持任一种迭代器,它们都是容器适配器类型,stack是用vector/d ...

  3. STL--容器适配器(queue、priority_queue、stack)

    适配器(Adaptor)是提供接口映射的模板类.适配器基于其他类来实现新的功能,成员函数可以被添加.隐藏,也可合并以得到新的功能. STL提供了三个容器适配器:queue.priority_queue ...

  4. C++ Primer 学习笔记_33_STL实践与分析(7) --容器适配器

    STL实践与分析 --容器适配器 引: 除了顺序容器.标准库还提供了三种顺序容器适配器:queue,priority_queue和stack.适配器是标准库中的概念.包含容器适配器,迭代器适配器和函数 ...

  5. c++ STL容器适配器

    一.标准库顺序容器适配器的种类     标准库提供了三种顺序容器适配器:queue(FIFO队列).priority_queue(优先级队列).stack(栈)   二.什么是容器适配器     &q ...

  6. STL之容器适配器queue的实现框架

    说明:本文仅供学习交流,转载请标明出处,欢迎转载! 上篇文章STL之容器适配器stack的实现框架已经介绍了STL是怎样借助基础容器实现一种经常使用的数据结构stack (栈),本文介绍下第二种STL ...

  7. 容器适配器————queue

    只能访问 queue<T> 容器适配器的第一个和最后一个元素.只能在容器的末尾添加新元素,只能从头部移除元素. 操作 queue<int> q;//创建一个int型的空队列q ...

  8. C++ Primer : 第九章 : vector变长、string的其他操作以及容器适配器

    vector变长机制.string的其他构造方法,添加.替换和搜索操作,string比较和数值转换,最后是容器适配器. vector对象是如何增长的 vector和string类型提供了一些成员函数, ...

  9. 容器适配器之queue

    转载http://blog.csdn.net/thefutureisour/article/details/7751846容器适配器容器适配器其实就是一个接口转换装置,使得我们能用特定的方法去操作一些 ...

随机推荐

  1. centos 6无法上外网

    1.先配置/etc/sysconfig/network-scripts/ifcfg-eth0 配置完成后能ping通内网.网关,但是上不了外网 DEVICE=eth0 HWADDR=:0C::FF:: ...

  2. 第九天- 文件操作 r w a 文件复制/修改

    文件操作简介:使用python来读写文件是非常简单的操作.我们使用 open() 函数来打开一个文件,获取到文件句柄.然后通过文件句柄就可以进行各种各样的操作了.根据打开⽅方式的不同能够执行的操作也会 ...

  3. CSS(二)选择符

     2019-04-11 22:14:23 1.类型选择符(标签选择符)  html中所有的标签都可以直接对元素选择  p em i a html body.....   特点:对页面中所有当前类型的元 ...

  4. 给大家分享下坐标转换的代码的JS和Python两个版本的源码【转】

    /** * Created by Wandergis on 2015/7/8. * 提供了百度坐标(BD09).国测局坐标(火星坐标,GCJ02).和WGS84坐标系之间的转换 */ /** * 百度 ...

  5. weex 数据绑定,动态控制组件的显示内容及样式

    无论的原生开发还是weex开发,经常会需要我们对一些组件/控件动态赋值,在原生中,我们大家都知道,对控件setText就可以了,那么在weex中呢,我们需要怎么做呢,其实很简单,几行代码就可以搞定!首 ...

  6. Two references point to the same heap memory

    Phone类 package com.itheima_03; /* * 手机类 */ public class Phone { String brand; int price; String colo ...

  7. 使用PermissionsDispatcher轻松解决Android权限问题

    之前也处理过6.0后的权限问题,直接处理很是麻烦.这次在github上搜到了关于权限星数最多的PermissionsDispatcher这个库,几个注释完美解决权限问题. 第一步 添加各种注释 1.@ ...

  8. Android8.0适配那点事(二)

    小伙伴们,咱们今天咱继续对Android8.0的适配进行分解,今天将针对启动页,版本适配和系统限制等进行“啃食” 猛戳这里查看Android8.0适配那点事(一): 1.启动页适配 近日,我无意中发现 ...

  9. 理解JMeter聚合报告(Aggregate Report)

    Aggregate Report 是 JMeter 常用的一个 Listener,中文被翻译为“聚合报告”.今天再次有同行问到这个报告中的各项数据表示什么意思,顺便在这里公布一下,以备大家查阅. 如果 ...

  10. Monte Carlo与TD算法

    RL 博客:http://blog.sciencenet.cn/home.php?mod=space&uid=3189881&do=blog&view=me&from= ...