C++:STL:常见容器:stack,queue, list

news2024/11/24 2:21:47

一:stack容器

1.1: stack基本概念 

概念:stack是一种先进后出 (First in last out FILO)的数据结构,它只有一个出口。

栈中:

1:只有栈顶的元素才可以被外界使用,因此栈不允许有遍历行为

2:进入 数据称为 -----入栈 push

3:  弹出 数据被称为 -----出栈  pop 

1.2: stack常用接口 

功能描述:栈容器常用的对外接口

构造函数

stack<T>  stk   // stack采用模板类实现,stack 对象的默认构造形式。

stack(const stack& stk) // 拷贝构造函数

赋值操作

stack&  operator=(const stack&  stk)  // 重载等号 操作符

数据存取

push(elem)   // 向栈顶添加元素

pop()   // 从栈顶移除元素 

top() // 返回栈 顶元素

大小操作

empty() // 判断堆栈是否为空

size()    // 返回栈的大小

#include<iostream>
#include<stack>
using namespace std;

void test() {
	stack<int> stk;
	stk.push(1);
	stk.push(2);
	stk.push(3);
	stk.push(4);

	cout << "栈 的大小" << stk.size() << endl;
	while (!stk.empty())
	{
		cout << "栈顶的元素是:" << stk.top() << endl;
		stk.pop();
	}
	cout << "栈的大小为:" << stk.size() << endl;
}

int main(){
	test();
}

 二:queue容器

2.1:queue基本 概念

概念:Queue是一种先进先出(First  in  First Out)数据结构,他有两个出口,队头和队尾。

队列容器:

1:允许从一端新增元素,从另一端移除元素。

2:只有队头和队尾才可以被外界使用,因此队列不允许有遍历行为 

3:进数据称为入队 ----push

4:  出数据称为出队-----pop

2.2:queue常用接口 

功能描述:队列容器常用的对外接口

构造函数:

queue<T>  que  //queue采用模板类实现,queue对象的默认构造函数。

queue(const queue&  que)    // 拷贝构造函数

赋值操作:queue& operator=(const  queue&  que)  //重载等号操作符

数据存取

push(elem)  //往队尾添加元素

pop()  //从队头移除元素

back() // 返回最后一个元素

front() //返回第一个元素

大小操作

empty()   // 判断队列是否为空

size()   // 返回栈的大小

void test1() {
	queue<Person> qe;
	Person p1("唐僧", 30);
	Person p2("孙悟空", 100);
	Person p3("猪八戒", 200);
	Person p4("沙僧", 800);

	qe.push(p1);
	qe.push(p2);
	qe.push(p3);
	qe.push(p4);
	cout << "队列的大小为:" << qe.size() << endl;

	while (!qe.empty())
	{
		cout << "队头元素---姓名:" << qe.front().m_Name << " 年龄:" << qe.front().m_Age << endl;
		cout << "队尾元素 ----姓名:" << qe.back().m_Name << " 年龄:" << qe.back().m_Age << endl;
		qe.pop();
		cout << endl;
	}
	cout << "队列的大小为: " << qe.size() << endl;
}

三 :list容器 

3.1 :list基本概念 

功能:将数据进行链式存储

链表(list):是一种物理存储单元上非连续的 存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的 。

链表的组成:链表由一系列的结点组成。

结点的组成:一个是存储数据元素的数据域,另一个是存储下一个 结点地址的指针域。

STL的链表:STL中的链表是一个双向循环链表,由于 链表的存储方式并不是连续的内存空间,因此链表  list中 的迭代器只支持前移和后移,属于双向迭代器 。

 list 的优点:

1:采用动态存储分配,不会造成内存浪费和溢出。

2:链表指向插入和删除操作十分方便,修改指针即可,不需要移动大量元素

list的缺点:

1:链表灵活,但是空间(指针域)和 时间(遍历)额外耗费较大

性质:

list有一个 重要的 性质,插入操作和删除操作都不会造成原有list 的迭代器 失效,但这在 vector是不成立的。

总结:STL中 list和 vector是两个常见使用的容器,他们各自优缺点。

3.2 :list构造函数 

功能描述:创建list 容器

函数原型:

list<T>  list    // list采用模板类实现,对象的默认构造形式。

list(beg, end)    // 构造函数将  【beg,end】区间中的元素 拷贝给本身  

list(n, elem)     // 构造函数将 n个 elem拷贝给本身

list(const list &lst)   // 拷贝构造函数。

 

template<typename T>
void printList(const list<T>& lst) {
	for (typename::std::list<T>::const_iterator it = lst.begin(); it != lst.end();  it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

void test2() {
	// 默认构造函数
	list<int> lst;
	lst.push_back(10);
	lst.push_back(20);
	lst.push_back(30);
	lst.push_back(40);
	printList(lst);

	// 区间构造
	list<int> lst2(lst.begin(), lst.end());
	printList(lst2);

	// 拷贝构造
	list<int> lst3(lst);
	printList(lst3);

	// 数值构造 
	list<int> lst4(3, 100);
	printList(lst4);

}

3.3  :list赋值和交换 

功能描述:给list 容器进行赋值,以及交换list容器

函数原型:

assign (beg, end)   //将【beg,end】区间中的数据拷贝赋值给本身

assign(n, elem)    //  将 n个 elem 拷贝赋值给本身

list&  operator=(const list&  lst)   // 重载等号操作符  

swap(lst)  // 将lst与本身元素互换。

 案例:测试list 赋值和交换操作 

void test3() {
	list<int> lst;
	lst.push_back(10);
	lst.push_back(20);
	lst.push_back(30);
	lst.push_back(40);
	printList(lst);

	list<int> lst2;
	lst2 = lst;  // 相当于 operator= 赋值
	printList(lst2);

	list<int> lst3;
	lst3.assign(lst2.begin(), lst2.end());
	printList(lst3);

	list<int> lst4;
	lst4.assign(3, 100);
	printList(lst4);

	cout << "交换前:" << endl;
	printList(lst);
	printList(lst4);

	lst.swap(lst4);
	cout << "交换后: " << endl;
	printList(lst);
	printList(lst4);
}

3.4:list大小操作 

功能描述:对 list 容器 大小进行操作

函数原型:

size()   // 返回容器中元素的个数

empty()  // 判断 容器是否为空

resize(num) // 重新指定容器的长度 为 num,  若容器变长,则以默认值填充新位置,如果容器变短,则末尾超出容器长度的元素被删除。

resize(num, elem)   // 重新指定容器的长度为 num ,若容器变长,则以elem 值填充新位置,如果容器变短,则末尾超出容器长度的元素被删除。

void test4() {
	list<int> lst;
	lst.push_back(10);
	lst.push_back(20);
	lst.push_back(30);
	lst.push_back(40);
	printList(lst);

	cout << "lst元素的 个数 为:" << lst.size() << endl;

	lst.resize(5, 100);
	printList(lst);

	lst.resize(2);
	printList(lst);
}

3.5 :list插入和删除 

功能描述:对 list容器进行数据插入和删除 

函数原型:

push_back(elem)  // 在容器尾部 加入一个元素

pop_back()  // 删除容器中最后一个元素 

push_front(elem)  // 在容器开头插入一个元素

pop_front()    // 从容器开头移除第一个元素

insert(pos,elem)  // 在pos位置插入  elem元素    ,返回 信息数据的 位置

inert(pos,n ,elem)  //  在 pos位置插入  n 个 elem元素,无返回值 

insert(pos, beg, end)   //在pos位置插入 【beg, end】 区间的数据,无返回值

clear()  //移除容器中所有数据

erase(beg,end)   // 删除【beg,end】区间 的数据,返回下一个数据的位置

erase(pos)   // 删除pos位置的数据,返回下一个元素的位置

remove(elem)  // 删除容器中所有与 elem匹配的 元素 

void test5() {
	list<int> lst;
	//尾插法
	lst.push_back(10);
	lst.push_back(20);
	lst.push_back(30);

	//头插法
	lst.push_front(100);
	lst.push_front(200);
	lst.push_front(300);
	printList(lst);

	// 尾删
	lst.pop_back();
	printList(lst);

	// 头删
	lst.pop_front();
	printList(lst);

	// insert插入
	list<int>::iterator it = lst.begin();
	lst.insert(++it, 10000);
	printList(lst);

	//erase删除 
	it = lst.begin();
	lst.erase(++it);

	// 移除
	lst.push_back(10000);
	printList(lst);

	// 清空
	lst.clear();
	printList(lst);
}

3.6 list数据存取 

功能描述:对 list 容器中数据 进行存取

函数原型

front()  // 返回第一个元素 

back() //  返回最后一个元素

注意 :

1:list容器中不可以通过[] 或者at 方式访问,这是因为 list 是链表,不是连续线性空间存储数据,迭代器 也不支持随机访问 。

2:返回第一个元素  -----front

3:返回最后一个元素 --- - back

void test6() {
	list<int> lst;
	lst.push_back(10);
	lst.push_back(20);
	lst.push_back(30);
	lst.push_back(40);

	cout << "第一个元素为:" << lst.front() << endl;
	cout << "最后 一个元素为:" << lst.back() << endl;

	// 验证迭代器不不支持随机访问
	list<int>::iterator it = lst.begin();
	// it = it + 1;  error :没有与之匹配的操作符 +
	it++;
}

3.7:  list反转和排序 

功能描述:将容器中的 元素反转,以及将容器中的数据进行排序

函数原型

reverse()    //反转链表

sort()    // 链表排序

void test7() {
	list<int> lst;
	lst.push_back(10);
	lst.push_back(20);
	lst.push_back(30);
	lst.push_back(40);
	
	cout << "反转 前 :" << endl;
	printList(lst);

	cout << "反转后:" << endl;
	lst.reverse();
	printList(lst);

	cout << "排序前:" << endl;
	list<int> lst2;
	lst2.push_back(20);
	lst2.push_back(70);
	lst2.push_back(10);
	lst2.push_back(40);
	lst2.push_back(30);

	cout << "升序后:" << endl;
	lst2.sort(); //sort()默认升序
	printList(lst2);

	cout << "降序排序:" << endl;
	lst2.sort(myCompare);
	printList(lst2);
}

3.8 :排序案例 

案例描述:将Person 自定义数据类型排序,Person中属性有 姓名,年龄,身高。

排序规则:按照年龄进行升序,如果年龄相同按照身高降序

class Person1 {
public:
	Person1(string name, int age, int height) {
		this->m_Name = name;
		this->m_Age = age;
		this->m_Height = height;
	}
	string m_Name;
	int m_Age;
	int m_Height;
};

bool myCompartor(Person1& p1, Person1& p2) {
	if (p1.m_Age == p2.m_Age) {
		// 年龄相同。按照身高降序
		return  p1.m_Height > p2.m_Height;
	}
	// 否则按照年龄升序
	return p1.m_Age < p2.m_Age;
}

void test8() {
	list<Person1> lst;
	Person1 p1("刘备", 35, 175);
	Person1 p2("曹操", 45, 180);
	Person1 p3("孙权", 25, 170);
	Person1 p4("赵云", 35, 190);
	Person1 p5("张飞", 25, 200);
	Person1 p6("关羽", 45, 175);

	lst.push_back(p1);
	lst.push_back(p2);
	lst.push_back(p3);
	lst.push_back(p4);
	lst.push_back(p5);
	lst.push_back(p6);

	for (list<Person1>::iterator it = lst.begin(); it != lst.end(); it++)
	{
		cout << "姓名:" << (*it).m_Name << "  年龄:" << it->m_Age << " 身高:" << it->m_Height<<endl;

	}

	cout << "排序后======================" << endl;
	lst.sort(myCompartor);
	for (list<Person1>::iterator it = lst.begin(); it != lst.end(); it++)
	{
		cout << "姓名:" << (*it).m_Name << "  年龄:" << it->m_Age << " 身高:" << it->m_Height<<endl;
	}
}

 

对于:自定义数据类型,必须要指定排序规则,否则编译器不知道如何进行排序

高级排序只是在排序的规则上再进行一次逻辑规则指定,并不复杂。 

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

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

相关文章

从FrameDebugger看Unity渲染

从FrameDebugger看Unity渲染(一) Unity如何渲染一个3D2D的游戏画面&#xff0c;今天通过FrameDebugger来看下Unity内置渲染管线的渲染策略, 后续再出一些URP渲染管线相关的文章。 对啦&#xff01;这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白&#xff0c…

MyBatis 实现复杂 Sql 查询

resultMap 结果映射 resultMap 元素是 MyBatis 中最重要最强大的元素&#xff0c;之前所写的 sql 语句&#xff0c;返回值都是简单的基本数据类型或者某一个实体类&#xff0c;比如下面这段 sql 返回的就是最简单的 User 类型。 <select id"getUserById" result…

微信HOOK 协议接口 实战开发篇 3.收发文本消息 附详细步骤

前言&#xff1a;本次文章附带详细的HOOK步骤&#xff0c;感兴趣可以尝试一番 使用了之前文章提到的字符搜索法 接收消息 1.OD打开微信&#xff0c;点击e&#xff0c;进入模块列表 2.双击wechatwin模块进入汇编代码页面 3.右键菜单&#xff0c;选择如图示选项 4.进入字符页…

【 uniapp - 黑马优购 | tabBar】如何创建和配置标签栏

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大二在校生&#xff0c;讨厌编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;小新爱学习. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc…

zabbix监控redis修正nodata问题

之前根据网上的资料尝试监控redis&#xff0c;完成后编写了文档。 https://blog.csdn.net/bigwood99/article/details/128404063 这几天观察数据&#xff0c;发现没有数据被采集。 在图标中显示no data。 检查模板中item和graphs设置&#xff0c;发现key中没有使用引号。 …

修复U盘【笔记】

修复U盘【笔记】前言参考修复U盘问题0.芯片精灵查看1.用APTool软件擦除量产信息2.用CBMTool量产U盘结果我的版本最后前言 以下内容源自网络 仅供学习交流使用 参考 总体步骤&芯片精灵下载&#xff1a;https://www.xpwin7.com/jiaocheng/25627.html 资源下载网址来源&am…

组织上线 | 资源共享,协作自如

新功能&#xff5e;&#xff01;期待已久的组织协作上线啦&#xff01; 上线后支持在组织下创建镜像&#xff0c;组织成员可查看、拉取镜像&#xff0c;快速实现镜像资源共享&#xff0c;组织高效协同。 具体怎么操作呢&#xff1f;跟我一起来看一下吧&#xff5e; 创建组织 …

Pandas计算历史均值

在用Python进行时间序列分析时&#xff0c;我们可能经常需要计算历史的一些特征。一般会使用rolling()函数&#xff0c;这里介绍一下计算包括当前行的历史特征和不包括当前行的历史特征 1. 包括当前行 这里先简单介绍一下rolling()函数 pandas.DataFrame.rolling官方文档 Dat…

数据库,计算机网络、操作系统刷题笔记19

数据库&#xff0c;计算机网络、操作系统刷题笔记19 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle…

Vue后台项目的记录 (二)

1、品牌静态管理组件 表单 分页器 2、品牌列表展示 创建相关接口文件 获取品牌管理数据的模块 统一接口管理 在main.js中引入&#xff0c;之后在任意组件中就可以使用了 发请求&#xff0c;获取品牌列表的接口 展示数据 current-change"handlecurrentchange curren…

贤鱼的刷题日常(数据结构队列学习)-2406:Card Stacking--题目详解

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;例题讲解2406:Card Stacking ✅创作者&#xff1a;贤鱼 ⏰预计时间&#xff1a;25分钟 &#x1f389;个人主页&#xff1a;贤鱼的个人主页 &#x1f525;专栏系列&#xff1a;c &#x1f341;贤鱼的个人社区&#xff0c;欢…

LabVIEW如何减少下一代测试系统中的硬件过时5

LabVIEW如何减少下一代测试系统中的硬件过时5 Steps to Replace Instruments Performance Requirements The important consideration to make when replacing instruments isthat the replacements must meet your requirements, usually by having equal orbetter measure…

6.1 微服务-Redis

6.1.1 Redis 6.1.1.1 前言 前面使用到的mysql数据库会出现以下问题 由于用户量增大&#xff0c;请求数量也随之增大&#xff0c;数据压力过大 多台服务器之间数据不同步 多台服务器之间的锁&#xff0c;已经不存在互斥性了。 6.1.1.2 Redis 6.1.1.2.1 什么是Redis Redi…

电脑屏幕录制怎么弄,简单好用的3种电脑录屏方法

平时工作或者学习都需要使用电脑进行录屏操作&#xff0c;比如录制线上网课、游戏画面、教学课程录屏等等。电脑屏幕录制怎么弄&#xff1f;可以使用专业录屏软件或者是电脑自带的屏幕录制功能来录屏&#xff1b;今天给大家分享3款简单好用的电脑录屏方法&#xff1b;无论是录制…

2022知识付费小程序源码升级版知识付费变现小程序独立后台版本源码+数据库和教程

知识付费小程序源码升级版主要功能简介&#xff1a; 本源码后台部分是thinkphp开发的&#xff0c;使用和二次开发都非常方便。 会员系统&#xff1a;用户登录/注册购买记录&#xff0c;收藏记录 基本设置&#xff1a;后台控制导航颜色&#xff0c;字体颜色&#xff0c;标题等…

软件测试面试话术 这样准备,让你成功拿到高薪offer

面试就是就是进入岗位前的临门一脚&#xff0c;如果因为准备不足而导致面试失败那可就亏大了&#xff01;因此&#xff0c;为了帮助大家提高面试成功率&#xff0c;尽快拿到高薪offer&#xff0c;我为你们准备了一套面试话术以及技巧&#xff0c;希望对即将参加软件测试面试的你…

MyBatis一级缓存和二级缓存

缓存的作用 在 Web 系统中&#xff0c;最重要的操作就是查询数据库中的数据。但是有些时候查询数据的频率非常高&#xff0c;这是很耗费数据库资源的&#xff0c;往往会导致数据库查询效率极低&#xff0c;影响客户的操作体验。于是可以将一些变动不大且访问频率高的数据&…

六、Java 13 新特性

六、Java 13 新特性 Java 13 已如期于 9 月 17 日正式发布&#xff0c;此次更新是继半年前 Java 12 这大版本发布之后的一次常规版本更新&#xff0c;在这一版中&#xff0c;主要带来了 ZGC 增强、更新 Socket 实现、Switch 表达式更新等方面的改动、增强。本文主要针对 Java 1…

开发检查测试参考文档整理

前言 【1】比起成为一名优秀的程序员&#xff0c;我更青睐于成为一名有价值的靠谱的员工。在企业工作中&#xff0c;我们既需要很好的去完成我们的日常需求&#xff0c;同时也需要去保证我们编写代码的质量&#xff0c;减少问题的发生&#xff0c;我们要去做靠谱的有责任心的员…

【Arduino串口数据保存到excel中常用三种方法】

【Arduino串口数据保存到excel中常用三种方法】 1. 前言2. 利用excel自带Data Streamer读取2.1 启用 Data Streamer 加载项2.2 刷写代码并将微控制器连接到你的电脑2.3 excel画图记录3. 采用插件ArduSpreadsheet读取3.1 安装ArduSpreadsheet3.2 Arduino 代码4. python代码解析4…