【STL十二】适配器——容器适配器

2023-05-16

【STL十二】适配器——容器适配器

  • 一、适配器
    • 1、适配器简介
    • 2、使用适配器的优点
    • 3、适配器种类
      • 3.1、容器适配器
      • 3.2、迭代器适配器
      • 3.3、函数适配器(function adapters)
  • 二、容器适配器
    • 1、简介
    • 2、分类
  • 三、stack适配器
    • 1、简介
    • 2、构造函数
    • 3、成员函数
    • 4、demo
  • 三、queue适配器
    • 1、简介
    • 2、构造函数
    • 3、成员函数
    • 4、demo
  • 四、priority_queue 适配器
    • 1、简介
    • 2、构造函数
    • 3、成员函数
    • 4、demo

一、适配器

1、适配器简介

  • 适配器本质上是使一事务的行为类似于另一类事务的行为的一种机制。
  • 适配器没有提供与元素的保存形式有关的真正数据结构实现,并且它不支持迭代器

2、使用适配器的优点

  • 让程序员选择一种合适的底层数据结构。

3、适配器种类

  • 容器适配器
  • 迭代器适配器
  • 函数适配器

3.1、容器适配器

  • 容器适配器是一个封装了序列容器的类模板,它在一般序列容器的基础上提供了一些不同的功能。

3.2、迭代器适配器

  • 迭代器适配器:是修改为某些基本容器定义的迭代器的接口的一种STL组件。
  • 反向迭代器和插入迭代器属于迭代器适配器,迭代器适配器扩展了迭代器的功能。

3.3、函数适配器(function adapters)

  • 函数适配器:通过转换或者修改其他函数对象使其功能得到扩展。可以将预先定义的仿函数和其他数值结合在一起。
  • 函数适配器种类
    • 否定器
    • 绑定器
    • 函数指针适配器

二、容器适配器

1、简介

  • 简单的理解容器适配器,其就是将不适用的序列式容器(包括 vector、deque 和 list)变得适用。

2、分类

  • STL 提供了 3 种容器适配器,分别为 stack 栈适配器、queue 队列适配器以及 priority_queue 优先权队列适配器。
容器适配器头文件特性基础容器筛选条件默认使用的基础容器
stack<stack >在同一端插入和删除元素,
先进后出(first-in,last-out,FILO)的特性
基础容器需包含以下成员函数:
empty()
size()
back()
push_back()
pop_back()
满足条件的基础容器有 vector、deque、list。
deque
queue<queue >在一端插入元素,在另一端取出元素,
先进先出(first-in,first-out,FIFO),插入和删除都较快
基础容器需包含以下成员函数:
empty()
size()
front()
back()
push_back()
pop_front()
满足条件的基础容器有 deque、list。
deque
priority_queue<priority_queue>也是一种队列,每个元素被给定了一个优先级,
以此来控制元素可被访问的顺序
基础容器需包含以下成员函数:
empty()
size()
front()
push_back()
pop_back()
满足条件的基础容器有vector、deque。
vector

三、stack适配器

1、简介

  • stack 栈适配器是一种单端开口的容器(如图 1 所示),实际上该容器模拟的就是栈存储结构,即无论是向里存数据还是从中取数据,都只能从这一个开口实现操作。
  • 先进后出(first-in,last-out,FILO)

stack 适配器的开头端通常称为栈顶。由于数据的存和取只能从栈顶处进行操作,因此对于存取数据,stack 适配器有这样的特性,即每次只能访问适配器中位于最顶端的元素,也只有移除 stack 顶部的元素之后,才能访问位于栈中的元素。

在这里插入图片描述

2、构造函数

template<
    class T,
    class Container = std::deque<T>
> class stack

T - 存储的元素类型。
Container - 用于存储元素的底层容器类型。

3、成员函数

  • 3.1、元素访问
成员函数功能
top访问栈顶元素
  • 3.2、容量
成员函数功能
empty检查底层容器是否为空
size返回容纳的元素数
  • 3.3、修改操作成员函数
成员函数功能
push向栈顶插入元素
emplace(C++11)在顶部原位构造元素
pop删除栈顶元素
swap(C++11)交换内容

4、demo

#include <iostream>
#include <stack>
#include <list>
using namespace std;
int main()
{
    //构建 stack 容器适配器
    list<int> values{ 1, 2, 3 };
    stack<int, list<int>> my_stack(values);
    //查看 my_stack 存储元素的个数
    cout << "size of my_stack: " << my_stack.size() << endl;
    //将 my_stack 中存储的元素依次弹栈,直到其为空
    while (!my_stack.empty())
    {
        cout << my_stack.top() << endl;
        //将栈顶元素弹栈
        my_stack.pop();
    }
    return 0;
}

输出

size of my_stack: 3
3
2
1

三、queue适配器

1、简介

  • queue 容器适配器有 2 个开口,其中一个开口专门用来输入数据,另一个专门用来输出数据
  • 先进先出(first-in,first-out,FIFO)

STL queue 容器适配器模拟的就是队列这种存储结构,因此对于任何需要用队列进行处理的序列来说,使用 queue 容器适配器都是好的选择

在这里插入图片描述

2、构造函数

template<
    class T,
    class Container = std::deque<T>
> class queue

T - 存储的元素类型。
Container - 用于存储元素的底层容器

3、成员函数

  • 3.1、元素访问
成员函数功能
front访问第一个元素
back访问最后一个元素
  • 3.2、容量
成员函数功能
empty检查底层容器是否为空
size返回容纳的元素数
  • 3.3、修改操作成员函数
成员函数功能
push向队列尾部插入元素
emplace(C++11)在尾部原位构造元素
pop删除首个元素
swap交换内容

4、demo

#include <iostream>
#include <queue>
#include <list>
using namespace std;
int main()
{
    //构建 queue 容器适配器
    std::deque<int> values{ 1,2,3 };
    // 使用dqueue对 queue 进行初始化
    std::queue<int> my_queue(values);//{1,2,3}
    //查看 my_queue 存储元素的个数
    cout << "size of my_queue: " << my_queue.size() << endl;
    //访问 my_queue 中的元素
    while (!my_queue.empty())
    {
        cout << my_queue.front() << endl;
        //访问过的元素出队列
        my_queue.pop();
    }
    return 0;
}

输出

size of my_queue: 3
1
2
3

四、priority_queue 适配器

1、简介

  • priority_queue 容器适配器中元素的存和取,遵循的并不是 “First in,First out”(先入先出)原则,而是“First in,Largest out”原则。直白的翻译,指的就是先进队列的元素并不一定先出队列,而是优先级最大的元素最先出队列。

  • 那么,priority_queue 容器适配器中存储的元素,优先级是如何评定的呢?很简单,每个 priority_queue 容器适配器在创建时,都制定了一种排序规则。根据此规则,该容器适配器中存储的元素就有了优先级高低之分。

举个例子,假设当前有一个 priority_queue 容器适配器,其制定的排序规则是按照元素值从大到小进行排序。根据此规则,自然是 priority_queue 中值最大的元素的优先级最高。
priority_queue 容器适配器为了保证每次从队头移除的都是当前优先级最高的元素,每当有新元素进入,它都会根据既定的排序规则找到优先级最高的元素,并将其移动到队列的队头;同样,当 priority_queue 从队头移除出一个元素之后,它也会再找到当前优先级最高的元素,并将其移动到队头。

基于 priority_queue 的这种特性,因此该容器适配器有被称为优先级队列.

2、构造函数

template<
    class T,
    class Container = std::vector<T>,
    class Compare = std::less<typename Container::value_type>
> class priority_queue;
  • typename T:指定存储元素的具体类型;

  • typename Container:指定 priority_queue 底层使用的基础容器,默认使用 vector 容器。

  • typename Compare:指定容器中评定元素优先级所遵循的排序规则,默认使用std::less按照元素值从大到小进行排序,还可以使用std::greater按照元素值从小到大排序,但更多情况下是使用自定义的排序规则。

其中,std::less 和 std::greater 都是以函数对象的方式定义在 头文件中。关于如何自定义排序规则,后续章节会做详细介绍。

3、成员函数

  • 3.1、元素访问
成员函数功能
top访问栈顶元素
  • 3.2、容量
成员函数功能
empty检查底层容器是否为空
size返回容纳的元素数
  • 3.3、修改操作成员函数
成员函数功能
push向队列尾部插入元素
emplace(C++11)在尾部原位构造元素
pop删除首个元素
swap交换内容

4、demo

#include <iostream>
#include <queue>
#include <array>
#include <functional>
using namespace std;
int main()
{
    //创建一个空的priority_queue容器适配器
    std::priority_queue<int>values;
    //使用 push() 成员函数向适配器中添加元素
    values.push(3);//{3}
    values.push(1);//{3,1}
    values.push(4);//{4,1,3}
    values.push(2);//{4,2,3,1}
    //遍历整个容器适配器
    while (!values.empty())
    {
        //输出第一个元素并移除。
        std::cout << values.top()<<" ";
        values.pop();//移除队头元素的同时,将剩余元素中优先级最大的移至队头
    }
    return 0;
}

demo

4 3 2 1

参考:
1、C++ STL 容器库 中文文档
2、STL教程:C++ STL快速入门
3、https://www.apiref.com/cpp-zh/cpp/header.html
4、https://en.cppreference.com/w/cpp/container
5、哔哩哔哩——侠姐聊算法——8.2.1 适配器与迭代器

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【STL十二】适配器——容器适配器 的相关文章

  • UART通信协议

    UART通信协议 一 UART是什么 xff1f 1 同步串口通信 vs 异步串口通信2 串行通信 二 通信协议三 工作原理四 特点 一 UART是什么 xff1f 通用异步收发传输器 xff08 Universal Asynchronou
  • win10右下角的通知区域

    属性 gt 通知和操作 gt 选择在任务栏上显示哪些图标 gt
  • UART一对多通信的方法

    通常 xff0c uart为单对单通信 xff0c 当用到一对多时可以用RS485 然而有时候我们MCU的uart口只剩一个 xff0c 又要接多个uart的外围芯片 xff0c 这时如果转成RS485需要加多个485收发器 xff0c 成
  • 全网最全的 postman 工具使用教程

    正文如下 xff0c 如果觉得有用欢迎点赞 关注 postman是一款支持http协议的接口调试与测试工具 xff0c 其主要特点就是功能强大 xff0c 使用简单且易用性好 无论是开发人员进行接口调试 xff0c 还是测试人员做接口测试
  • 星际争霸1终于可以在win10上运行了

    win7的时候 xff0c 星际争霸1就不能运行 xff0c 只好装了个虚拟机 xff0c 在虚拟机里玩 刚刚更新到了win10 xff0c 总觉得在虚拟机里玩不是个事 xff0c 就去网上搜索 xff0c 终于发现了办法 在 StarCr
  • windows下编译opencv 3.4.0

    为了方便后期的调试 xff0c 自己动手编译opencv3 4 0 xff0c 这样有需要的时候还可以自己修改修改源代码 通常来说 xff0c 编译32位比较简单 xff0c 直接用cmake生成编译的工程就行了 xff0c 但64位就比较
  • opencv添加的新接口clearVec()的实现

    自己编译的opencv xff0c 之前文章有说添加了这个接口 xff0c 也有上传3 3 0版本添加这个接口之后编译好的库 xff0c 但是没有把实现过程展现出来 xff0c 导致有些朋友问我如何实现的 xff0c 今天把这个实现放出来
  • 苏泊尔电饭煲不工作的维修

    本篇文章与其说是维修 xff0c 倒不如说成是 拆 xff0c 因为维修相对容易 xff0c 但想拆开却很艰难 xff0c 大部分的时间都花在了拆的工作上面 老家伙的样子如下 型号为 xff1a CYSB50FC99 100 xff0c 铭
  • 萨克斯吹不响的解决办法

    刚开始吹萨克斯 xff0c 发现总是吹不响 看各种入门的文章 xff0c 很多都强调口型的重要性 xff0c 各文章说得也都差不多 xff0c 我仔细捉摸 xff0c 不断尝试 xff0c 似乎还是不得要领 特别是安装好之后 xff0c 很
  • vs2010制作安装工程

    这里的安装工程 xff0c 是指制作安装包 xff0c 而不是vs2010的安装包 用向导生成一个安装工程 xff0c 通常会直接打开一个文件编辑窗口 xff1a 这个窗口很容易编辑 xff0c 把所有要安装的文件拖到 应用程序文件夹 上
  • windows下编译ffmpeg源代码

    由于工作原因 xff0c 需要使用ffmpeg在windows下进行代码跟踪 于是 xff0c 上网找相关文章 xff0c 搜索出来有很多 xff0c 经过查看 xff0c 其中的一个英文网站是最好的 xff0c 网址 xff1a http
  • 注册控件失败之一:提示0x80040200错误的处理办法

    今天有客户反馈说控件无法注册 xff0c 晕 xff0c 这问题好容易困扰开发者以及客服人员 xff0c 但是环境千差万别 xff0c 很难做到完全自动化 出现的错误号码有很多 xff0c 但相对的0x80040200这个号码出现的概率较其
  • win10+ubuntu23.04双系统安装

    win10 win10先安装好 xff08 确保主板上各个螺丝稳定 xff0c 至少4对螺丝 43 铜柱 xff0c 否则会各种蓝屏 xff09 如果双系统安装失败了 xff0c 连win10都进不去了 xff0c 用原版ISO刻录的U盘或
  • 冷门指标移中平均线和多空指数的完美结合(一定要看)

    注 xff0c 原贴地址 xff1a http blog sina com cn s blog 7f0a6fa50101hyls html 在此谨以记录防止原帖无法打开为忧 冷门指标移中平均线和多空指数的完美结合 一定要看 xff09 20
  • LINUX下安装QT的惨痛经历

    安装QT的惨痛经历 目标 xff1a 2012 4月下旬 xff0c 计划开始在linux上安装QT和ffmpeg xff0c 准备摸索一下视频客户端的开发 以下是安装过程 由于没有额外的电脑 xff0c 所以使用了虚拟机安装 电脑上刚好有
  • Linux下CAN总线速率设置,socketCAN。

    背景 xff1a 飞思卡尔Freescale的ARM9处理器i MX25系列 socketCAN对于在Linux下操作CAN总线非常的快捷方便 xff0c 其配置方法和在Linux下对网卡的配置相似 xff0c 方法如下 xff1a 1 i
  • c++在Linux环境下的套接字Tcp通信例子(demo)

    demo包括服务端和客户端的通信 xff0c 发送端发送格式为先发送长度为5的字符串数据 xff0c 告知对方接下来的数据长度 xff0c 接收端首先接收到消息长度 xff0c 再根据消息长度接受接下来的消息 服务端 xff1a inclu
  • yolo_mark工具的使用

    之前自己编译了一下yolo mark用来标注样本 我编译时yolo mark依赖了opencv3 2 0 当时为了方便直接把yolo mark exe放到编译yolo的文件夹 现在要在其他地方使用 xff0c 就把所有文件整理出来 其中op
  • GStreamer与opencv实现rtsp推流

    文章目录 前言安装库代码总结 前言 最近工作遇到瓶颈了呀 xff01 xff01 xff01 公司分配给我的任务是deepstream部署 xff0c 太难了 xff0c gstreamer语言学的我头皮发麻 xff01 xff01 xff
  • 【STM32学习5】STM32使用printf函数 打印到电脑串口助手

    本文所使用的方法与代码参考自正点原子 xff0c 如果想要详细了解这方面的知识 xff0c 请阅读正点原子官方提供的文档 一 背景 在开发STM32应用时 xff0c 将一些信息通过串口打印到电脑上是常用的调试手段 C语言标准库中的prin

随机推荐