STL——list、stack与queue

news2024/11/17 0:55:53

在这里插入图片描述

📖作者介绍:22级树莓人(计算机专业),热爱编程<目前在c++阶段>——目标Windows,MySQL,Qt,数据结构与算法,Linux,多线程,会持续分享学习成果和小项目的
📖作者主页:热爱编程的小K
📖专栏链接:c++

🎉欢迎各位→点赞👏 + 收藏💞 + 留言🔔​
💬总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🐾

在这里插入图片描述

文章目录

    • 一、list
      • 1、简介
      • 2、操作基本数据类型
      • 3、操作自定义类型
      • 4、sort函数的五花八门
      • 5、删除操作
    • 二、stack
      • 1、stack概念
      • 2、简单应用—进制转换
      • 3、练习—leetcode20.有效的括号
    • 三、queue
      • 1、queue
        • A、概念
        • B、操作
      • 2、deque
        • A、概念
        • B、操作
      • 3、priority_queue
        • A、概念
        • B、操作基本数据类型
        • C、操作自定义类型


一、list

1、简介

list 容器,又称双向链表容器,即该容器的底层是以双向链表的形式实现的。这意味着,list 容器中的元素可以分散存储在内存空间里,而不是必须存储在一整块连续的内存空间中。

2、操作基本数据类型

初始化可以直接赋值,也可以不赋值

void testOne() 
{
	list<int> nums = { 1,2,3,4 };
	list<string> str;
	str.push_back("king");
	str.push_back("link");
	for (auto v : str) 
	{
		cout << v << " ";
	}
	cout << endl;
	//删除方式遍历
	while (!str.empty()) 
	{
		cout << str.front() << endl;
		str.pop_front();
	}
}

3、操作自定义类型

记得重载输出运算符,或者提供打印接口

class MM 
{
public:
	MM(string name=" ",int age=0):name(name),age(age){}
	friend ostream& operator<<(ostream& out,const MM& object)
	{
		out << object.age << "\t" << object.name << endl;
		return out;
	}
	string getName() const{ return name; }
	int getAge() const{ return age; }
protected:
	string name;
	int age;
};
void testTwo() 
{
	list<MM> mm;
	mm.push_back(MM("king", 18));
	mm.push_back(MM("貂蝉", 28));
	mm.push_back(MM("妲己", 19));
	for (auto v : mm) 
	{
		cout << v;
	}
	cout << endl;

}

4、sort函数的五花八门

sort函数默认的是从小到大排序(less<>()),也可以greater<>()方式进行排序,sort的参数是一个排序准则(后面可以用仿函数,会方便很多),这里我们自己写函数排序准则

bool cmpAge(const MM& one, const MM& two) {
	return one.getAge() < two.getAge();
}
bool cmpName(const MM& one, const MM& two ) {
	return one.getName() < two.getName();
}
void testthree() {
	list<int> nums = { 2,3,8,65,43,0,4 };
	nums.sort();
	for (auto v : nums) {
		cout << v << " ";
	}
	cout << endl;
	nums.sort(less<int>()); //等价于默认
	for (auto v : nums) {
		cout << v << " ";
	}
	cout << endl;
	nums.sort(greater<int>());  //重大到小
	for (auto v : nums) {
		cout << v << " ";
	}
	cout << endl;
	nums.reverse();  //反转
	for (auto v : nums) {
		cout << v << " ";
	}
	cout << endl;
	list<MM> info;
	info.push_back(MM("貂蝉", 18));
	info.push_back(MM("狂铁", 19));
	info.push_back(MM("妲己", 34));
	cout << "按年龄排序" << endl;
	info.sort(cmpAge);
	for (auto v : info) {
		cout << v;
	}
	cout << endl;
	cout << "按姓名排" << endl;
	info.sort(cmpName);
	for (auto v : info) {
		cout << v;
	}
	cout << endl;
}

5、删除操作

当使用一个容器的insert或者erase函数通过迭代器插入或删除元素"可能"会导致迭代器失效,因此我们为了避免危险,应该获取insert或者erase返回的迭代器,以便用重新获取的新的有效的迭代器进行正确的操作

bool find_name(const MM& three, string name) {
	return three.getName() == name;
}
void Test() 
{
	list<MM> info;
	info.push_back(MM("貂蝉", 18));
	info.push_back(MM("狂铁", 19));
	info.push_back(MM("妲己", 34));
	auto iter = find_if(info.begin(), info.end(), bind(find_name, placeholders::_1, "妲己"));
	info.erase(iter);
	for (auto v : info) {
		cout << v;
	}
	cout << endl;
	//迭代器删除
	for (auto i = info.begin(); i != info.end();)
	{
		if (i->getName() == "狂铁") 
		{
			i = info.erase(i);
		}
		else 
		{
			i++;
		}
	}
	for (auto v : info) 
	{
		cout << v;
	}
}

二、stack

1、stack概念

stack是一种容器适配器,专门设计用于在LIFO上下文(后进先出)中操作,在LIFO上下文中,仅从容器的一端插入和提取元素。

stack作为容器适配器实现,它们是使用特定容器类的封装对象作为其基础容器的类,提供了一组特定的成员函数来访问其元素。元素从特定容器的尾部被推入*/弹出,这被称为堆栈的*顶部。

容器应支持以下操作:

  • empty
  • size
  • back
  • push_back
  • pop_back

标准容器类vector,deque 和list满足这些要求。默认情况下,使用标准容器 deque来作为底层容器。

2、简单应用—进制转换

将123转换为二进制

void test1() {
	int nums = 123;
	stack<int> mm;
	while (nums) 
	{
		mm.push(nums % 2);
		nums /= 2;
	}
	while (!mm.empty()) 
	{
		cout << mm.top();
		mm.pop();
	}
}

3、练习—leetcode20.有效的括号

给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  • 左括号必须用相同类型的右括号闭合。
  • 左括号必须以正确的顺序闭合。
  • 每个右括号都有一个对应的相同类型的左括号。

示例 1:

输入:s = “()”
输出:true
示例 2:

输入:s = “()[]{}”
输出:true
示例 3:

输入:s = “(]”
输出:false

提示:

1 <= s.length <= 104
s 仅由括号 ‘()[]{}’ 组成

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/valid-parentheses

题解放在代码中啦

class Solution {
public:
    bool isValid(string s) 
	{
		stack<char> result;
		for (auto v : s) 
		{
			if (v == '(' || v == '[' || v == '{') 
			{
				result.push(v);
			}
			else 
			{
                //列举反例的情况
				if (!result.empty())   //v='}'
				{
					char out = result.top();
					if (v == '}' && out != '{') 
					{
						return false;
					}
					if (v == ']' && out != '[') 
					{
						return false;
					}
					if (v == ')' && out != '(') 
					{
						return false;
					}
                    //括号匹配,出栈
					result.pop();
				}
                //进来的不是左括号,且栈也是空的(进来的是右括号)
				else 
				{
					return false;
				}
			}
		}
        //最后判断栈中还有没有单个元素
		return result.empty();
	}
};

三、queue

1、queue

A、概念

FIFO队列

queue是一种容器适配器,专门设计用于在FIFO上下文中(先进先出)进行操作,在FIFO上下文中,将元素插入到容器的一端,并从另一端提取元素。

queue被实现为容器适配器,它们是使用特定容器类的封装对象作为其基础容器的类,提供了一组特定的成员函数来访问其元素。元素被推入特定容器的*“后部”,并从其“前部”弹出*。

基础容器可以是标准容器类模板之一,也可以是其他一些专门设计的容器类。此基础容器应至少支持以下操作:

  • empty
  • size
  • front
  • back
  • push_back
  • pop_front

标准容器类 deque和list满足这些要求。默认情况下,如果未为特定容器指定容器类队列,类实例化,默认用标准容器 deque

B、操作

//入栈
void push(Type  data);
void pop();

//获取栈顶元素
Type front()
int size();
bool empty();
#include<iostream>
#include<string>
#include<queue>
using namespace std;
void testOne() 
{
	queue<int> mm;
	mm.push(9);
	mm.push(8);
	mm.push(7);
	while (!mm.empty())
	{
		cout << mm.front() << " ";
		mm.pop();
	}
	cout << endl;
}
int main() 
{
	testOne();
	return 0;
}

2、deque

A、概念

deque是“double-ended queue”的缩写,和vector一样都是STL的容器,deque是双端队列,而vector是单端的。

deque在接口上和vector非常相似,在许多操作的地方可以直接替换。

  • deque 容器也擅长在序列尾部添加或删除元素(时间复杂度为O(1)),而不擅长在序列中间添加或删除元素。
  • deque 容器也可以根据需要修改自身的容量和大小。

和 vector 不同的是,deque 还擅长在序列头部添加或删除元素,所耗费的时间复杂度也为常数阶O(1)。并且更重要的一点是,deque 容器中存储元素并不能保证所有元素都存储到连续的内存空间中。

B、操作

class MM 
{
public:
	MM(string name=" ",int age=0):name(name),age(age){}
	void print() const { cout << name << "\t" << age << endl; }
	string getName() { return name; }
	int getAge() { return age; }
protected:
	string name;
	int age;
};
void testTwo() 
{
	deque<MM> info;
	info.push_back(MM("貂蝉", 19));
	info.push_back(MM("妲己", 20));
	info.push_back(MM("狂铁", 20));
	while (!info.empty()) {
		info.front().print();
		info.pop_front();
	}
}

3、priority_queue

A、概念

priority_que(优先级队列)是一种容器适配器,经过专门设计,以使其按照某些*严格的弱排序(strict weak ordering)*标准,其第一个元素始终是其中包含的最大元素。

严格是说在判断的时候会用"<",而不是"<=",弱排序是因为,一旦"<“成立便认为存在”<“关系,返回ture,而忽略了”=“关系和”>"区别,把它们归结为false。

此上下文类似于,可以在任何时候插入元素,并且只能检索最大堆元素(优先级队列顶部的元素)。

优先级队列被实现为容器适配器,它们是使用特定容器类的封装对象作为其基础容器的类,提供了一组特定的成员函数来访问其元素。元素被弹出从特定容器的*“后退”,称为优先级队列的顶部*。

基础容器可以是任何标准容器类模板或某些其他专门设计的容器类。该容器应可通过随机访问迭代器访问并支持以下操作:

  • empty()
  • size()
  • front()
  • push_back()
  • pop_back()

标准容器类 vector和 deque满足这些要求。默认情况下,如果未为特定容器指定容器类

priority_queue 类实例化,默认使用vector作为底层容器。

需要支持随机访问迭代器,以始终在内部保持堆结构。容器适配器通过自动调用算法函数(make_heap, push_heap,pop_heap )维持堆结构。

B、操作基本数据类型

void testthree() 
{
	cout << "偷懒版本" << "\t";
	priority_queue<int> q1;//默认less排,出队重大到小
	q1.push(1);
	q1.push(99);
	q1.push(0);
	while (!q1.empty())
	{
		cout << q1.top() << " ";
		q1.pop();
	}
	cout << endl;
	cout << "完整版本 less" << "\t";
	priority_queue<int, vector<int>, less<int>> king;
	king.push(1);
	king.push(2);
	king.push(88);
	king.push(0);
	while (!king.empty())
	{
		cout << king.top() << " ";
		king.pop();
	}
	cout << endl;
	cout << "完整版本  greater" << "\t";
	priority_queue<int, vector<int>, greater<int>> kin;
	kin.push(1);
	kin.push(2);
	kin.push(88);
	kin.push(0);
	while (!kin.empty())
	{
		cout << kin.top() << " ";
		kin.pop();
	}
	cout << endl;
}

C、操作自定义类型

第一种是写运算符重载,不常用,第二种是自己写仿函数描述函数准则

在这里插入图片描述

class MM 
{
public:
	MM(string name=" ",int age=0):name(name),age(age){}
	void print() const { cout << name << "\t" << age << endl; }
	bool operator<(const MM& object) const
	{
		return this->age < object.age;
	}
	string getName()const { return name; }
	int getAge()const { return age; }
protected:
	string name;
	int age;
};
struct cmpAgeless 
{
	bool operator()(const MM& one, const MM& two) 
	{
		return one.getAge() > two.getAge();
	}
};
void test4() 
{
	cout << "不常用方法:重载运算符" << endl;
	priority_queue<MM, vector<MM>, less<MM>> mm;
	mm.push(MM("貂蝉", 19));
	mm.push(MM("妲己", 20));
	mm.push(MM("狂铁", 22));
	while (!mm.empty())
	{
		mm.top().print();
		mm.pop();
	}
	cout << endl;
	cout << "写仿函数,自己定义函数准则" << endl;
	priority_queue<MM, vector<MM>, cmpAgeless> mm1;
	mm1.push(MM("貂蝉", 19));
	mm1.push(MM("妲己", 20));
	mm1.push(MM("狂铁", 22));
	while (!mm1.empty())
	{
		mm1.top().print();
		mm1.pop();
	}
	cout << endl;
}

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

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

相关文章

Springboot 整合 Mybatis

创建SpringBoot项目 首先在IDEA中创建一个SpringBoot项目&#xff0c;注意Java Version 然后Packaging为Jar包形式&#xff0c;Type改为Maven形式。 在上图的下一步中可以选择相关依赖&#xff0c;也可以在项目里面的pom文件中自己添加相关依赖&#xff0c;然后进行import也可…

在外包搞了7年,废了.....

我以自身的经验告诫大家&#xff0c;不要去外包&#xff0c;原因&#xff1a; 无法深入理解项目&#xff1a;由于外包公司通常只负责项目的某一个部分或某一个阶段&#xff0c;软件测试人员无法对整个项目进行深入了解&#xff0c;可能会影响到测试的全面性和准确性。 对测试要…

RB-PEG-NHS;NHS-PEG-Rhodamine罗丹明聚乙二醇琥珀酰亚胺 红色荧光染料罗丹明B功能化聚乙二醇

RB-PEG-NHS,罗丹明-聚乙二醇-活性脂 中文名称&#xff1a;罗丹明-聚乙二醇-活性脂 英文名称&#xff1a;RB-PEG-NHS 性状&#xff1a;固体或者粘稠液体&#xff0c;取决于分子量大小。 溶剂&#xff1a;溶于大部分有机溶剂&#xff0c;溶于水。 分子量&#xff1a;400、60…

【深度学习】RNN、LSTM、GRU

【深度学习】RNN、LSTM、GRU RNNLSTMGRU结语 RNN 和普通神经网络一样&#xff0c;RNN有输入层、输出层和隐含层&#xff0c;不一样的是RNN在不同的时间 t t t会有不同的状态&#xff0c;其中 t − 1 t-1 t−1时刻隐含层的输出会作用到 t t t时刻的隐含层。 RNN因为加入了时间…

强大的图像查看器:EdgeView mac中文

EdgeView mac中文版是mac上一款强大的图像查看软件&#xff0c;可以处理一些最流行的图像文件格式&#xff0c;同时还提供对导航杂志或漫画书的支持。EdgeView能够打开著名的图像文件格式主要包括JPG&#xff0c;GIF&#xff0c;PSD在内的多种格式文件&#xff0c;支持Retina显…

深度解析JavaScript自动化测试工具Cypress的工作运行原理

目录 引言 什么是Cypress&#xff1f; Cypress的工作原理 Cypress运行原理 Cypress和其他自动化测试工具有什么不一样&#xff1f; Cypress的缺点 【自动化测试工程师学习路线】 引言 在当今的软件开发中&#xff0c;自动化测试工具已成为不可或缺的一部分&#xff0c;…

负载均衡式在线OJ

目录 项目介绍所用技术与开发环境所用技术开发环境 项目各种安装升级 gcc安装 jsoncpp安装 cpp-httplib安装boost库安装与测试 ctemplate 项目宏观结构总体文件目录comm : 公共模块compile_run_server&#xff1a;编译和运行compiler.hpp编译runner.hpp 运行compiler_runner.hp…

ChatGPT 速通手册——开源社区的进展

开源社区的进展 在 ChatGPT 以外&#xff0c;谷歌、脸书等互联网巨头&#xff0c;也都发布过千亿级参数的大语言模型&#xff0c;但在交谈问答方面表现相对 ChatGPT 来说都显得一般。根据科学人员推测&#xff0c;很重要的一部分原因是缺失了RLHF(Reinforcement Learning with…

Banana Pi CM4 计算机模组评测(VS 树莓派计算模块 CM4)

如果您正在寻找一款可靠的单板计算机来提升您的下一个项目&#xff0c;但找不到满足您需求的 Raspberry Pi&#xff0c;让我们看看我是否可以提供帮助。在这篇详细的评论中&#xff0c;我将向您介绍 Banana Pi CM4&#xff0c;这是一款适用于各种任务的多功能且功能强大的解决方…

【OpenCV 例程 300篇】257.OpenCV 生成随机矩阵

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】257. OpenCV 生成随机矩阵 3.2 OpenCV 创建随机图像 OpenCV 中提供了 cv.randn 和 cv.randu 函数生成随机数矩阵&#xff0c;也可以用于创建随机图像。 函数 cv.randn 生成的矩阵服从正态分布&…

【caddy】 caddy反向代理api服务 聚合go-zero微服务 放过nginx让caddy来快速实现吧

帮助go-zero开发者聚合api 相关视频一、go-zero 微服务整体架构1、微服务的基本架构2、go-zero 微服务的 apiauthrpc.api 文件routes.go 文件 二、本地开发的痛点1、本地多个端口开启的服务2、apifox、postman 三、caddy1、mac下caddy安装2、配置我们自己的caddyfile1&#xff…

SpringBootWeb入门-HTTP协议

一、SpringBootWeb-快速入门 建好springboot工程之后&#xff0c;只留下这几个文件。 这个是springboot的父工程&#xff0c;其实就是继承 二、HTTP协议-概述 •HTTP-概述 三、HTPP协议-请求协议 四、HTTP协议-响应协议 一、状态码大类 状态码分类说明1xx响应中——临时状态码…

buuctf -2

目录 你竟然赶我走 大白 N种方法解决 [ACTF2020 新生赛]Include 1 php://filter的一些学习 [ACTF2020 新生赛]Exec [强网杯 2019]随便注 你竟然赶我走 1.下载文件&#xff0c;得到一张图片 2.放进010分析&#xff0c;在文件尾得到flag 大白 1.根据题目提示&#xff0…

Python安装模块总失败?一次教你学会镜像安装

人生苦短&#xff0c;我用python 安装模块总是不成功&#xff1f; 这次一次性讲清楚~ 还是安装报错指路:点击此处跳转文末名片获取 为什么会出现安装模块失败? 首先我们要知道 其实大部分我们在用的模块, 都是歪果仁开发的, 然而我们在输入 “pip install 模块名” 的时候,…

「 JVM 」常见的垃圾收集器Garbage collector(GC)

「 JVM 」常见的垃圾收集器Garbage collector&#xff08;GC&#xff09; 参考&鸣谢 【JVM系统学习之路】常见垃圾回收器 山间木匠 Java 的七种垃圾收集器 | Linux 中国 Jayashree Huttanagoudar 带你走近Java虚拟机到底有哪些经典的垃圾收集器 码上遇见你 文章目录 「 JV…

2023.04.17 运行开源代码tinyriscv步骤及遇到问题

tinyriscv&#xff1a;https://gitee.com/liangkangnan/tinyriscv/tree/verilator 如有错误之处还请不吝赐教&#xff01; 1、安装gcc工具链 下载gcc工具链(百度云链接&#xff0c;提取码&#xff1a;yaib)&#xff0c;使用下面的命令解压到/opt/riscv32目录下&#xff1a; …

Spring定时任务常用Cron表达式

目录 一、SpringBoot定时任务 定时任务概述 创建定时任务 代码开启定时任务 执行结果 &#xff08;单线程&#xff09; 多线程处理定时任务 执行结果&#xff08;并发&#xff09; 二、Cron详解 Cron表达式是什么 Cron表达式的结构 每个域可出现的字符类型和各字符的…

花生采摘

[NOIP2004 普及组] 花生采摘 题目描述 鲁宾逊先生有一只宠物猴&#xff0c;名叫多多。这天&#xff0c;他们两个正沿着乡间小路散步&#xff0c;突然发现路边的告示牌上贴着一张小小的纸条&#xff1a;“欢迎免费品尝我种的花生&#xff01;――熊字”。 鲁宾逊先生和多多都…

linux 安装神州通用数据库 V7.0

linux 安装神州通用数据库 V7.0 操作系统、数据库1、官方下载链接2、windows客户端下载链接3、官方安装手册4、安装前准备3.1、创建安装用户3.2、以root 用户修改神通数据库安装包的所有者为shentong 用户3.3、以root 用户创建神通数据库主目录并修改所有者为shentong 用户3.4、…

学成在线笔记+踩坑(2)——【内容模块】课程基础查询,swagger+数据库字典+Httpclient+跨域

目录 1.【内容模块】需求分析 2.【内容模块】模块工程的结构 3.【课程查询功能1】通用 3.1 分析数据模型 3.2 mybatis-plus代码生成器 3.3 内容模块聚合api,model,service模块 3.4 接口设计分析 3.5 【基础模块】分页查询模型类 3.6【基础模块】日期配置类 3.7【内容…