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

news2025/1/28 1:01:24

【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 适配器与迭代器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/433626.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ubuntu NVIDIA-Docker安装

Ubuntu NVIDIA-Docker安装 Docker简介NVIDIA驱动安装NVIDIA-Docker安装 系统环境&#xff1a; 系统&#xff1a;linux 版本&#xff1a;ubuntu20.04 Docker简介 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中&#…

WebRTC真实IP泄露

WebRTC真实IP泄露 1.概述2.利用漏洞获取真实IP地址演示3.WebRTC介绍4.WebRTC 泄漏真实IP原理5.防范措施 1.概述 很多人可能误以为使用代理就可以完全隐藏我们的真实IP地址&#xff0c;但实际并不总是这样。事实上&#xff0c;有大量文章指出&#xff0c;WebRTC存在安全风险&am…

零项目零科研,本科排名倒数,一战上岸上海交大电子与通信工程

笔者来自通信考研小马哥23上交819全程班学员 本科就读于哈工大&#xff08;威海&#xff09;&#xff0c;本科成绩很差&#xff0c;专业排名62/99&#xff0c;没有科研&#xff0c;没有实验室&#xff0c;没有项目&#xff0c;连最基本大家都会参加的科技立项我四年也没有参与…

幽灵空白节点

图片下面为什么会有空白间隙呢&#xff1f;因为内联元素默认都是和 a 的下边缘基线对齐&#xff0c;基线和底部是有一段距离的&#xff0c;所以图片下面有一段间隙。 <style>.container {background-color: red;}img {width: 100px;height: 100px;} </style><d…

误删恢复及备份恢复

误删恢复&#xff0c;及备份恢复 一、误删恢复1.1用losf恢复进程存在的文件1.2恢复EXT类型的文件 二、备份恢复的集中方式2.1用xfsdump&#xff0c;xfsrestore对xfs类型文件进行备份恢复2.2用cpio命令备份恢复2.2.1通过find过滤文件进行备份 一、误删恢复 1.1用losf恢复进程存…

自然语言处理实战项目4-文本相似度的搜索功能,搜索文本内容

大家好&#xff0c;我是微学AI&#xff0c;今天给大家带来自然语言处理实战项目4-文本相似度的搜索功能&#xff0c;搜索文本内容。文本相似度搜索是一种基于自然语言处理技术&#xff0c;用于搜索和匹配文本内容的方法。其主要目的是将用户输入的查询内容与已有的文本数据进行…

c盘满了怎么清理垃圾而不误删?C盘清理,4个方法!

案例&#xff1a;c盘满了怎么清理垃圾而不误删 【我的c盘现在已经爆红了&#xff01;想清理下c盘的文件&#xff0c;但是害怕误删重要的文件&#xff0c;应该怎么做才能清理c盘但不误删重要的文件呀&#xff01;急需答案&#xff01;】 随着时间的推移&#xff0c;c盘可能会因…

游戏服务器如何搭建

无论是游戏公司还是游戏爱好者&#xff0c;游戏服务器都是不可或缺的一部分。游戏服务器承载着游戏的运行和体验&#xff0c;是在所有玩家之间建立连接的纽带。如果你想了解如何搭建游戏服务器以及相关的配置要求&#xff0c;那么本文是无法错过的。在本文中小编将为您介绍如何…

Nginx安装注意事项

一.看你是什么系统,先从官网下载你想要的版本 二.windows系统 直接解压就行了 conf 是放配置文件的地方 html是 放页面的位置 ,欢迎页也在这里 有什么静态资源也可以放这里 logs 放日志文件 在路径栏位置直接cmd 开启命令窗口 注意这里是在nginx.exe文件所在目录进行的…

TOOM解析如何搭建一套适合自己的舆情监测系统?完整的实战指南

随着互联网的普及和社交媒体的盛行&#xff0c;人们在网络上的活动越来越多&#xff0c;同时也涌现出大量的信息和舆情。这些信息和舆情在一定程度上会影响社会和个人的发展和进步。因此&#xff0c;舆情监测逐渐成为一项重要的任务。在本篇文章中&#xff0c;我们将为大家介绍…

Adobe国际认证中文官网

Adobe国际认证中文官网是Adobe公司为了帮助用户提高技能水平和职业竞争力而推出的认证服务。该官网提供了一系列的Adobe认证考试&#xff0c;包括Photoshop、Illustrator、InDesign、Premiere Pro等多个软件的认证考试。通过参加这些考试&#xff0c;用户可以获得Adobe认证&…

ASEMI代理ADG5412BRUZ-REEL7原装ADI车规级ADG5412BRUZ-REEL7

编辑&#xff1a;ll ASEMI代理ADG5412BRUZ-REEL7原装ADI车规级ADG5412BRUZ-REEL7 型号&#xff1a;ADG5412BRUZ-REEL7 品牌&#xff1a;ADI/亚德诺 封装&#xff1a;TSSOP-16 批号&#xff1a;2023 引脚数量&#xff1a;5 安装类型&#xff1a;表面贴装型 ADG5412BRUZ-…

《花雕学AI》你知道人工智能ChatGPT在10秒钟里能写出多少种标题吗?我试了24次,惊呆了!

今天准备测试AI绘画&#xff0c;使用几个不同的AI平台来生成猫娘图片&#xff0c;以此具体学习绘图的AI咒语。这篇博客用什么标题好呢&#xff1f;于是&#xff0c;我开始关心如何优化标题&#xff0c;还是老办法&#xff0c;不懂就问ChatGPT&#xff08;没有正式账号&#xff…

PHP实现输入英文语句统计单词数量,使用函数随机获取数组的最小值和最大值这两个程序的代码

目录 前言 一、输入英文语句&#xff0c;统计单词数量 1.1运行流程&#xff08;思想&#xff09; 1.2代码段 1.3运行截图 二、使用函数随机获取数组的最小值和最大值 2.1运行流程&#xff08;思想&#xff09; 2.2代码段 2.3运行截图 前言 1.因多重原因&#xff0c;本…

WordPress安装

目标 在一台 CentOS Stream release 8 虚拟机上&#xff0c;安装一台WordPress 6.2 安装过程 安装依赖组件 依赖组件可以参考官方文档&#xff1a;https://developer.wordpress.org/advanced-administration/before-install/ 主要有3个组件&#xff1a; PHP 7.4 or greate…

爬虫为什么需要多线程

多线程爬虫是一种同时运行多个线程来提高爬取速度的爬虫方式。通过将大量的工作分配给不同的线程&#xff0c;可以减少爬虫的运行时间&#xff0c;提高效率。不过需要注意的是&#xff0c;在爬取过程中需要合理的管理线程数&#xff0c;以避免对被爬取的网站造成过大的负荷。 …

再聊 MySQL 聚簇索引

为什么是再次理解呢&#xff1f;因为松哥之前写过相关的文章介绍过聚簇索引&#xff0c;但是感觉还不够&#xff0c;因此今天想再来和小伙伴们聊一聊这个话题。 1. 什么是聚簇索引 数据库的索引从不同的角度可以划分成不同的类型&#xff0c;聚簇索引便是其中一种。 聚簇索引…

家用洗地机怎么选?洗地机选购技巧分享

洗地机是一种专业的清洁设备&#xff0c;广泛应用于商业和工业领域。它可以有效地清洗和护理各种硬表面地板&#xff0c;如混凝土、大理石、瓷砖和木地板等。洗地机不仅能够提高清洁效率&#xff0c;还可以使地面更加卫生、美观和持久。而且大部分洗地机还拥有一键自清洁、除菌…

为什么企业都需要搭建搭建一个内部知识库?

企业内部知识管理是指企业通过各种手段收集、整理、管理和传播企业内部的知识&#xff0c;以提高企业的竞争力和创新能力。在实践中&#xff0c;企业内部知识管理往往需要建立一个内部知识库&#xff0c;以更好地实现知识的共享和管理。本文将从以下几个方面探讨为什么企业内部…

华为豪气分红720亿,持股员工人均超50万?

当有的公司还在因为各种原因裁员的时候&#xff0c;有的公司已经要分红了。 最近&#xff0c;华为在内部论坛“心声社区”公布&#xff0c;经华为公司内部有权机构决议&#xff0c;拟向股东分配股利人民币 719.55 亿元。相比 2021 年分红总额 614.04 亿元&#xff0c;同比增加…