STL学习-容器适配器

一.stack栈

1.栈的介绍

stack 栈是一种只在一端(栈顶)进行数据插入(入栈)和删除(出栈)的数据结构,它满足后进
先出(LIFO)的特性。
使用push(入栈)将数据放入stack,使用pop(出栈)将元素从容器中移除。

栈的结构如图:

在头文件<stack>中,class stack定义如下:

namespace std{
template <typename T,
typename container = deque<T>>
class stack;
}

第一个参数T代表类型,第二个参数用来定义stack内部存放数据的容器,默认为deque。之所以选择deque而非vector,是因为deque移除数据时可能会释放内存,并在插入数据需要扩容时不需要复制所有的数据。

std::stack<int> st;//定义一个元素类型为整数的栈

stack 只是很单纯地把各项操作转化为内部容器对应的函数调用。你可以使用任何支持back()、push back()和pop back()成员函数的标准容器支持 stack。例如你可以使用vector或list 来存放数据:

stack<int,vector<int> st;

注意:forword_list和array不可以作为容器

2.stack定义及初始化

#include <iostream>
#include<stack>
#include <vector>
#include <list>
using namespace std;
int main()
{
stack<char> s1;//创建一个默认的栈,最常用
stack<char,deque<char>>s2;//显示创建用deque保存数据的栈,和s1等价
stack<int,vector<int>>s3;//创建用vector保存数据的栈
stack<int,list<int>>s4;//创建用list保存数据的栈
return 0;
}

3.常用操作

stack栈的操作比较简单,不支持迭代器和运算符

常用的成员函数及其函数原型:

//empty成员函数
void pop();//pop成员函数:出栈函数,删除栈顶元素
void push(const Type&_val);//push成员函数:入栈函数,往栈顶添加数据
size_type size()const;//size成员函数:返回栈的数据个数
//top成员函数,返回栈顶元素的引用

二.queue队列

1.queue队列介绍

queue队列是一个先进先出的队列,从一段插入数据,另一端获取与删除数据

push() 入队,back()获取队尾元素的引用,pop()出队,front()获取队头元素的引用

queue的结构

namespace std{
template <typename T,
typename container =deque<T>>
class queue;
}

第一个参数代表元素类型,第二个参数是queue内部存放函数的容器,默认使用deque

queue<int> q1;//包含int数据的q1

实际上queue只是简单的把各项操作转为内部容器对应的函数调用。你可以使用支持front(),pop front(),back(),push back()操作的其它容器作为queue内部的容器。例如使用list作为内部容器的queue。

queue<int,list<int>> q2;//包含int数据的q2,内部存储数据的容器为list

2.定义及初始化

#include <queue>
#include <iostream>
#include <vector>
#include <list>
using namespace std;
int main()
{
queue<char> q1;//定义存放char数据的队列,内部使用默认deque容器
queue<char,deque<char>> q2;//同q1,显示说明用deque
// queue <int,vector<int>> q3;//定义存放int数据的队列,内部使用vector容器
//q3.push(10);//入队10,vector感觉可以,实际不可以
queue<int,list<int>> q4;//定义存放int数据的队列,内部使用list容器
return 0;
}

注意:因为vector不支持pop_front,所以不能使用vector不能作为队列的容器

3.常用操作

queue队列操作简单,不支持迭代器和运算符,只要几个操作函数。
back成员函数
返回最后一个元素的引用。
empty成员函数
判断queue队列是否为空,是返回true,不是返回false.
front成员函数
返回第一个元素的引用。
pop成员函数
删除第一个元素(在队头处删除)。
push成员函数
将元素添加到队列(插入在队尾)。
size成员函数
返回queue队列元素的个数。

int main()
{
queue<int>cq;//创建一个int的空队列g
for(int i=0;i<10;i++)//入队0~9
q.push(i);cout<<"队列的数据个数:"<<q.size()<<endl;
cout <<"队头元素:"<<q.front()<<",队尾元素:"<<q.back()<< endl;
cout<<"出队"<< endl;while(!q.empty())//只要q不空,循环继续
{
cout<<q.front()<<endl;//输出队头元素
q.pop();
}return 0;
}

三.priority queue优先级队列

1.priority queue优先级队列介绍

priority queue优先级队列,它的接口和queue非常相似,有入队push(),获取第一个元素top(),pop删除第一个元素。这里的第一个元素并不是第一个放入的元素,而是"优先级最高“的元素。
priority queue内的元素已经根据其值进行了排序。当然你可以通过参数指定一个排序准则,默认的排序是升序排列。所谓的第一个元素就是当前"数值最大的元素”(默认的vector第一个"最大值”元素保存在最后,因为vector尾删效率高)。如果同时存在多个数值最大的元素,我们无法确定哪一个在前哪一个在后。


其内部数据结构为:大根堆
不能使用list作为其容器


priority queue也是定义在头文件<queue>中

结构如下:

namespace std(
template<typename T,
typename container=vector<Type>
typename Compare=less<typename Container::value type>>
class priority_queue;
}

第一个参数T是元素类型,第二个参数为内部存放元素的容器,默认为vector,第三个参数是排序规则,默认是升序(less)。

下面定义一个int的priority queue。

priority_queue<int,deque<int>> pq2;//创建一个int的优先级队列,使用deque作为存储数据的容器

下面定义一个使用降序排序规则的优先级队列:

priority_queue<int,vector<int>,greater<int>> pq3;

2.定义及初始化

#include <queue>
#include <iostream>
using namespace std;
int main()
{
priority_queue<int>q1;//创建一个保存int的空优先级队列
if(q1.empty())
cout<<"q1是空的,它的数据个数为:"<<q1.size()<<endl;
//创建一个保存int,且用deque保存内部数据的优先级队列(默认为升序)
priority queue <int,deque <int>>q2;
q2.push(5);//入队
q2.push(15);//入队
q2.push(10);//入队
cout<<"q2的数据:";
while(!q2.empty())//只要q2不为空,循环继续
{
cout<< q2.top()<<"";//输出第一个元素的值(最大)
q2.pop();//删除第一个元素
}
cout << endl;
//创建保存int,用vector保存内部数据且降序的优先级队列
priority queue <int,vector<int>,greater<int>> q3,
q3.push(2);//入队
q3.push(1);//入队
q3.push(3);//入队
cout<<"q3的数据:";
while(!g3.empty())
{
cout << q3.top()<<"";//输出第一个元素的值(最小)
q3.pop();//删除第一个元素
}
cout << endl;
q1.push(100);
q1.push(200);
cout<<"q4的数据:";
while(!q4.empty())
{
cout<< q4.top()<<"";
q4.pop();
}
cout << endl;
//利用迭代器创建优先级队列
vector <int> v5{10,30,20,40};
priority_queue <int>q5(v5.begin(),v5.end());
cout<<"q5的数据:";
while(!q5.empty())
{
cout << q5.top()<<" ";
q5.pop();
}
cout << endl;
return 0;
}

3.常用操作

priority queue优先级队列的操作比较简单,只要几个简单的成员函数。
empty成员函数
判断优先级队列是否为空。是返回true,不是返回false。
pop成员函数
把第一个元素从队列删除
push成员函数
往优先级队列中插入一个数据。
size成员函数
返回优先级队列数据个数。
top成员函数
返回第一个元素的引用。

int main()
{
priority_queue<int> q;//创建一个空优先级队列
if(q.empty())
cout<<"q是一个空队"<<endl;
q.push(3);
q.push(2);
q.push(5);
q.push(4);
q.push(1);
cout<<"插入5个数据之后,当前的数据个数为"<<q.size()<< endl;
cout<<"依次出队的数据为:";
while(!q.empty())//只要q1不为空,循环继续
{
cout << q.top()<<" ";
q.pop();
}
return 0;
}

4.深入priority queue

其内部是使用STL的堆排序heap算法

下面是queue文件部分源码

template<class Ty,class _Container =vector< Ty>,
class_Pr = less<typename _Container::value_type>>
class priority_queue
{
protected:
_Container c{};//容器
_Prcomp{};//比较函数对象
public:
template <class _Alloc,enable_if_t<uses_allocator_v<_container,_Alloc>,int>= 0>
priority_queue(const _Pr&_Pred,const _Container&_Cont,const _Alloc& _AI):
c(_Cont,_Al),comp(_Pred)//构造函数
{
make_heap(c.begin(),c.end(),comp);//变成堆(默认为大根堆)
}
void push(const value_type& Val){
c.push_back(_Val);
push_heap(c.begin(),c.end(),comp);//往堆增加一个元素
}
void pop(){
pop_heap(c.begin(),c.end(),comp);//从堆中删除一个元素
c.pop_back();
}
}

可以看到其内部使用heap函数

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

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

相关文章

【C语言】动态内存开辟

写在前面 C语言中有不少开辟空间的办法&#xff0c;但是在堆上开辟的方法也就只有动态内存开辟&#xff0c;其访问特性与数组相似&#xff0c;但最大区别是数组是开辟在栈上&#xff0c;而动态内存开辟是开辟在堆上的。这篇笔记就让不才娓娓道来。 PS:本篇没有目录实在抱歉CSD…

海的记忆:海滨学院班级回忆录项目

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

【VScode】C/C++多文件夹下、多文件引用、分别编译——仅一个设置【适合新人入手】

【VScode】C/C多文件夹内的多文件引用编译 1、问题2、前提&#xff08;最简环境&#xff09;3、核心&#xff08;关键配置&#xff09;4、成功享用~ 1、问题 在使用 VScode 编写一个简单项目的时候&#xff0c;没有特别配置的情况下&#xff0c;若主文件(.c)引用了自定义的头文…

62 mysql 中 存储引擎MyISAM 中索引的使用

前言 固定数据表 mysql. tables_priv 的表结构创建如下 CREATE TABLE tables_priv (Host char(60) COLLATE utf8_bin NOT NULL DEFAULT ,Db char(64) COLLATE utf8_bin NOT NULL DEFAULT ,User char(32) COLLATE utf8_bin NOT NULL DEFAULT ,Table_name char(64) COLLATE u…

使用buildx构建多架构平台镜像

1. 查看buildx插件信息 比较新的docker-ce版本默认已经集成了buildx插件 [rootdocker ~]# docker buildx version github.com/docker/buildx v0.11.2 9872040 [rootdocker ~]#2. 增加多平台镜像构建支持 通过tonistiigi/binfmt:latest初始化一个基于容器的构建环境&#xff…

数据库基础(3) . Navicat使用

0.下载安装 官网 : https://www.navicat.com.cn/ Navicat 中国 | 支持 MySQL、Redis、MariaDB、MongoDB、SQL Server、SQLite、Oracle 和 PostgreSQL 的数据库管理 1.连接数据库 1.1.连接 1.1.1.点击连接 打开navicat 点击 左上角连接 1.1.2.选择MySQL 弹出配置界面 1.1…

MySQL(上)

一、SQL优化 1、如何定位及优化SQL语句的性能问题&#xff1f;创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因&#xff1f; 对于性能比较低的sql语句定位&#xff0c;最重要的也是最有效的方法其实还是看sql的执行计划&#xff0c;而对于mysql来说&a…

国密SM2 非对称加解密前后端工具

1.依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.21</version></dependency><dependency><groupId>org.bouncycastle</groupId><artifactId>bcpki…

【银河麒麟操作系统】软raid重建速度限制问题分析

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://documentkylinos.cn 现象描述 遇到软raid重建速度问题&#xff0c;分…

ssm教室信息管理系统+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码看文章最下面 需要定制看文章最下面 目 录 目 录 III 1 绪论 1 1.1 研究背景 1 1.2目的和意义 1 1.3 论文结构安排 2 2 相关技术 3 …

去中心化存储:Web3中的数据安全新标准

随着Web3的兴起&#xff0c;去中心化存储逐渐成为数据安全的新标准。传统的中心化存储方式将数据集中保存在少数服务器上&#xff0c;这种模式尽管在早期互联网中被广泛应用&#xff0c;但随着数据量和数据价值的增加&#xff0c;其潜在的安全风险和隐私问题也逐渐暴露。而去中…

Ubuntu 22 安装 Apache Doris 3.0.3 笔记

Ubuntu 22 安装 Apache Doris 3.0.3 笔记 1. 环境准备 Doris 需要 Java 17 作为运行环境&#xff0c;所以首先需要安装 Java 17。 sudo apt-get install openjdk-17-jdk -y sudo update-alternatives --config java在安装 Java 17 后&#xff0c;可以通过 sudo update-alter…

安卓摄像头的详细使用

安卓摄像头的详细使用 一、引言二、权限设置三、打开摄像头四、摄像头的属性设置&#xff08;一&#xff09;预览尺寸&#xff08;二&#xff09;图片格式&#xff08;三&#xff09;对焦模式 五、摄像头预览六、拍照功能七、视频录制 一、引言 在安卓开发中&#xff0c;摄像头…

服务器的配置复杂,租用时该如何选择参数?

对于互联网企业来说&#xff0c;开发一套可以接入互联网的产品&#xff0c;并利用它来盈利是终极目的。但互联网产品必须有服务器才能运行&#xff0c;对于很多公司来说&#xff0c;托管服务器成本太高&#xff0c;而租用服务器才算得上是最好的选择&#xff0c;但面对配置参数…

10min本地安装Qwen1.5-0.5B-Chat

大模型系列文章 本地电脑离线部署大模型 配置&#xff1a;MAC-M1-8GB 10min本地安装Qwen1.5-0.5B-Chat 大模型系列文章前言一、下载Qwen1.5-0.5B-Chat二、构造函数chatBot.py三、启动命令1、放置脚本2、启动命令3、效果图 前言 在人工智能领域&#xff0c;大模型无疑是最炙手…

90%会展主办方都会用的6款数字化工具

在会展行业&#xff0c;数字化转型已成为提升竞争力的关键。面对日益增长的运营成本和收入增长的瓶颈&#xff0c;主办方需要借助数字化工具来实现效率提升和成本控制。 今天介绍几种常见的数字化工具和应用方式。 一、线上展览平台 构建线上展览平台是会展主办方拓展线上销…

弃用 RestTemplate,来了解一下官方推荐的 WebClient !

在 Spring Framework 5.0 及更高版本中&#xff0c;RestTemplate 已被弃用&#xff0c;取而代之的是较新的 WebClient。这意味着虽然 RestTemplate 仍然可用&#xff0c;但鼓励 Spring 开发人员迁移到新项目的 WebClient。 WebClient 优于 RestTemplate 的原因有几个&#xff…

SpringBoot+Thymeleaf电商系统

> 这是一个基于SpringBootThymeleafBootstrap实现的简单电商系统。 > 实现了用户浏览、添加购物车、商品管理等功能&#xff0c;并支持响应式布局。 > 本项目适合JAVA初学者作为入门学习项目 一、部分界面演示 二、技术栈 技术栈中文描述Spring Boot快速开发框架…

02-Dubbo特性及工作原理

02-Dubbo特性及工作原理 Dubbo 的特性 这里说一下 Dubbo 最主要的特性&#xff0c;从这些特性中&#xff0c;就可以看出来我们为什么要选用 Dubbo&#xff0c;也可以将 Dubbo 和 Spring Cloud 进行对比&#xff0c;比如我们搭建一套微服务系统&#xff0c;出于什么考虑选用 Dub…

20241102在荣品PRO-RK3566开发板的预置Android13下适配宸芯的数传模块CX6603N

20241102在荣品PRO-RK3566开发板的预置Android13下适配宸芯的数传模块CX6603N 2024/11/2 18:04 在WIN10使用程序&#xff1a;ViewLink-4.0.7_0708-windows-x64.exe 在荣品PRO-RK3566开发板的预置Android13下使用&#xff1a;ViewLink-2023_12_21-release-0.2.6.apk adb install…