c++学习笔记-提高篇-STL标准模板库3(stack容器、queue容器以及list容器)

目录

Stack容器

一、Stack容器介绍

二、stack常用接口

三、栈的示例

queue(队列)容器

一、queue容器介绍

二、queue常用接口

三、queue示例

list容器

一、list容器介绍

二、list常用接口及示例

(一)list构造函数

(二)list赋值和交换

(三)list大小操作

 (四)list插入和删除

 (五)list数据存取

(六) list反转和排序


stack容器

一、stack容器介绍

二、stack常用接口

三、栈的示例

#include<iostream>
using namespace std;
#include<stack>//栈stack容器
void test01()
{//特点:符合先进后出数据结构stack<int>s;//入栈s.push(10);s.push(20);s.push(30);s.push(40);s.push(50);cout << "栈的大小为:" << s.size() << endl;//只要栈不为空,查看栈顶,并执行出栈操作while(!s.empty()){//查看栈顶元素cout << "栈顶元素为:" << s.top() << endl;//出栈s.pop();}cout << "栈的大小为:" << s.size() << endl;
}int main()
{test01();system("pause");return 0;
}

queue(队列)容器

一、queue容器介绍

二、queue常用接口

三、queue示例

#include<iostream>
using namespace std;
#include<queue>class Person
{
public:Person(string name, int age){this->m_Name = name;this->m_Age = age;}string m_Name;int m_Age;
};//队列Queue
void test01()
{//创建队列queue<Person>q;//准备数据Person p1("唐僧", 30);Person p2("孙悟空", 1000);Person p3("猪八戒", 900);Person p4("沙僧", 800);q.push(p1);q.push(p2);q.push(p3);q.push(p4);cout << " 队列的大小:" << q.size() << endl;//只要队列不为空,查看队头和队尾while (!q.empty()){//查看队头cout << "队头元素 --- 姓名:" << q.front().m_Name << "  年龄:" << q.front().m_Age << endl;cout << "队尾元素 --- 姓名:" << q.back().m_Name << "  年龄:" << q.back().m_Age << endl;//出队q.pop();}cout << " 队列的大小:" << q.size() << endl;}int main()
{test01();system("pause");return 0;
}

deque(双端队列)是一种可以从两端添加和删除元素的数据结构,而queue(队列)只能从一端添加元素,从另一端删除元素。 

list容器

一、list容器介绍

  • 功能:将数据进行链式存储;
  • 链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链实现的;
  • 链表的组成:由一系列的节点组成
  • 结点的组成:存储数据元素的数据域 + 下一个结点地址的指针域
  • STL中的链表是一个双向循环链表

优点:1.可以对任意位置进行快速插入或删除元素,修改指针即可;2.采用动态存储分配,不会造成内存浪费和溢出。

缺点:1.对于容器的遍历速度,没有数组快;2.占用的空间比数组大。

prev指向前一个节点的指针,next指向后一个节点的指针,链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于双向迭代器

vector和list是两个常用的容器,各有优缺点

二、list常用接口及示例

(一)list构造函数

1.功能描述:创建list容器

2.函数原型:

 3.示例

#include<iostream>
using namespace std;
#include<list>
//list容器构造函数void printList(const list<int>& L)  //const防止迭代器被修改
{for (list<int>::const_iterator it = L.begin(); it != L.end(); it++)//const_iterator只读迭代器{cout << *it << "  ";//访问指针it所指向的内存地址上的值}cout << endl;
}void test01()
{//创建list容器list<int>L1;//添加数据L1.push_back(10); //尾插L1.push_back(20); //尾插L1.push_back(30); //尾插L1.push_back(40); //尾插//遍历容器printList(L1);//区间方式构造list<int>L2(L1.begin(), L1.end());printList(L2);//拷贝构造list<int>L3(L2);printList(L3);//10个1000list<int>L4(10, 1000);printList(L4);}void main()
{test01();system("pause");
}

(二)list赋值和交换

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

2.函数原型:

 3.示例

#include<iostream>
using namespace std;
#include<list>void printList(const list<int>& L)
{for (list<int>::const_iterator it = L.begin(); it != L.end(); it++){cout << *it << " ";}cout << endl;
}//list容器的赋值个交换
//赋值
void test01()
{list<int>L1;L1.push_back(10);L1.push_back(20);L1.push_back(30);L1.push_back(40);printList(L1);list<int>L2;L2 = L1; //Operator= 赋值printList(L2);list<int>L3;L3.assign(L2.begin(), L2.end());printList(L3);list<int>L4;L4.assign(10, 100);printList(L4);
}void test02()
{list<int> L1;L1.push_back(10);L1.push_back(20);L1.push_back(30);L1.push_back(40);list<int>L2;L2.assign(10, 100);cout << "交换前:" << endl;printList(L1);printList(L2);L1.swap(L2);cout << "交换后:" << endl;printList(L1);printList(L2);}int main()
{test02();system("pause");return 0;
}

(三)list大小操作

1.功能描述:对容器的大小进行操作

2.函数原型:

3.示例

#include<iostream>
using namespace std;
#include<list>
//list容器大小操作
void printList(const list<int>& L)
{for (list<int>::const_iterator it = L.begin(); it != L.end(); it++){cout << *it << " ";}cout << endl;}
void test01()
{list<int>L1;L1.push_back(10);L1.push_back(20);L1.push_back(30);L1.push_back(40);printList(L1);if (L1.empty()){cout << "L1为空" << endl;}else{cout << "L1不为空" << endl;cout << "L1的元素个数:" << L1.size() << endl;}//重新指定大小L1.resize(10);printList(L1);L1.resize(12, 111);printList(L1);L1.resize(2);printList(L1);}int main()
{test01();system("pause");return 0;
}

 (四)list插入和删除

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

2.函数原型:

pos不要用索引值,要用迭代器

3.示例:

#include<iostream>
using namespace std;
#include<list>
//list容器插入和删除/*
-push_back(elem);//在容器尾部加入一个元素
-pop_back(elem);//删除容器中最后一个元素
-push_front(elem);//在容器首部加入一个元素
-pop_front(elem);//删除容器开头的一个元素
-insert(pos,elem);//在pos位置处插入elem元素的拷贝,返回新数据的位置
-insert(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 printList(const list<int>&L)//const防止迭代器被修改
{for (list<int>::const_iterator it = L.begin(); it != L.end(); it++){cout << *it << " ";}cout << endl;
}void test01()
{list<int>L;//尾插L.push_back(10);L.push_back(20);L.push_back(30);//头插L.push_front(100);L.push_front(200);L.push_front(300);//300 200 100 10 20 30printList(L);//尾删L.pop_back();L.pop_front();printList(L);//插入L.insert(L.begin(), 1000);printList(L);list<int>::iterator it = L.begin();L.insert(++it, 2000);printList(L);//删除it = L.begin();L.erase(it);//L.erase(++it); printList(L);//移除L.push_back(10000);printList(L);L.remove(10000);printList(L);}int main()
{test01();system("pause");return 0;
}

 (五)list数据存取

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

2.函数原型:

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

3.示例:

#include<iostream>
using namespace std;
#include<list>//list容器  数据存取
void test01()
{list<int> L1;L1.push_back(10);L1.push_back(20);L1.push_back(30);L1.push_back(40);//L1[0]   不可以用[]访问list容器中的元素//L1.at(0)  不可以用at的方式来访问list中的元素//原因是list本质是链表,不是用连续的线性空间存储数据,迭代器不支持随机访问的cout << "第一个元素" <<L1.front()<< endl;cout << "最后一个元素" << L1.back() << endl;//验证迭代器不支持随机访问的list<int>::iterator it = L1.begin();it++; //支持递增it--; //支持递减//it = it + 1; 不支持随机访问
}int main()
{test01();system("pause");return 0;
}

(六)list反转和排序

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

2.函数原型:

  • reverse();//反转链表
  • sort();//链表排序

3.示例:

list排序时自己有sort()成员函数,默认升序;降序排序时,需要给sort()函数传入回调函数

#include<iostream>
using namespace std;
#include<list>
#include<algorithm>void printList(const list<int>& L)//防止打印的时候误操作加const
{for (list<int>::const_iterator it = L.begin(); it != L.end(); it++){cout << *it << " ";}cout << endl;
}void test01()
{list<int>L1;L1.push_back(20);L1.push_back(10);L1.push_back(50);L1.push_back(40);L1.push_back(20);cout << "反转前:" << endl;printList(L1);cout << "反转后:" << endl;L1.reverse();printList(L1);
}bool myConpare(int v1,int v2)
{//降序  就让第一个数大于第二个数return v1 > v2;
}void test02()
{list<int>L1;L1.push_back(20);L1.push_back(10);L1.push_back(50);L1.push_back(40);L1.push_back(20);cout << "排序前:" << endl;printList(L1);//所有不支持随机访问迭代器的容器,不可以用标准算法//不支持随机访问迭代器的容器,内部会提供对应一些算法cout << "升序 排序后:" << endl;sort(L1.begin(), L1.end());L1.sort();//默认排序规则是从小到大  升序printList(L1);cout << "降序 序排序后:" << endl;L1.sort(myConpare);printList(L1);}//list容器反转和排序
int main()
{//test01();test02();system("pause");return 0;
}

(七)list-排序案例

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

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

3.示例:

使用回调函数进行排序,回调函数是排序规则

#include<iostream>
#include<list>
using namespace std;//list容器  排序案例
//1.案例描述:将Person自定义数据类型进行排序,Person中属性有姓名、年龄、身高
//2.排序规则:按照年龄进行升序,如果年龄相同再按照身高进行降序class Person
{
public:Person(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 comparePerson(Person& p1,Person& p2)
{//年龄升序if (p1.m_Age == p2.m_Age){//年龄相同  按照身高降序return p1.m_Height > p2.m_Height;}else{return p1.m_Age < p2.m_Age;}
}void test01()
{list<Person>L;//准备数据Person p1("刘备", 35, 175);Person p2("曹操", 45, 180);Person p3("孙权", 40, 170);Person p4("赵云", 25, 195);Person p5("张飞", 35, 160);Person p6("关羽", 35, 200);//插入数据L.push_back(p1);L.push_back(p2);L.push_back(p3);L.push_back(p4);L.push_back(p5);L.push_back(p6);for (list<Person>::iterator it = L.begin(); it != L.end(); it++){cout << "姓名:" << (*it).m_Name << "  年龄:" << it->m_Age << "  身高:" << it->m_Height << endl;}//排序cout << "-----------------------------------" << endl;cout << "排序后:" << endl;L.sort(comparePerson);for (list<Person>::iterator it = L.begin(); it != L.end(); it++){cout << "姓名:" << (*it).m_Name << "  年龄:" << it->m_Age << "  身高:" << it->m_Height << endl;}
}int main()
{test01();system("pause");return 0;
}

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

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

相关文章

使用Swift Package Manager (SPM)实现xcframework分发

Swift Package Manager (SPM) 是苹果官方提供的用于管理 Swift 项目的依赖关系和构建过程的工具。它是一个集成在 Swift 编程语言中的包管理器&#xff0c;用于解决在开发过程中管理和构建包依赖项的需求。 1、上传xcframework.zip到服务端 压缩xcframeworks成一个zip包&…

【flink】状态清理策略(TTL)

flink的keyed state是有有效期(TTL)的&#xff0c;使用和说明在官网描述的篇幅也比较多&#xff0c;对于三种清理策略没有进行横向对比得很清晰。 全量快照清理(FULL_STATE_SCAN_SNAPSHOT)增量清理(INCREMENTAL_CLEANUP)rocksdb压缩清理(ROCKSDB_COMPACTION_FILTER) 注意&…

MySQL数据管理————外键

方式一&#xff1a;在创建表的时候&#xff0c;增加约束&#xff08;麻烦&#xff0c;比较复杂&#xff09; CREATE TABLE grade( gradeid INT(10) NOT NULL AUTO_INCREMENT COMMENT 年级id, gradename VARCHAR(50) NOT NULL COMMENT 年级名称, PRIMARY KEY(gradeid) )ENGINEI…

国图公考:公考常识题如何复习更高效?

公务员考试是许多人求职的首选之一&#xff0c;而公考常识题作为公务员考试的重要组成部分&#xff0c;对于考生来说具有很高的分值。在这一模块的复习中&#xff0c;有以下几点可以帮助考生提高学习效率&#xff0c;一起来看一下吧! 一、明确复习目标 了解自己在各个知识点上…

gitee版本回退本地和仓库的执行步骤(后悔药,无副作用,按说明书使用)

目录 1.本地回退 1.打开项目文件夹 3.回退到指定版本 4.选择回退模式并确认 5.本地回退成功 2.回退仓库版本 1.在git上面找到项目的提交记录 2.找到提交错误的版本​编辑 3.双击新页面这个版本进去 点击操作再点击revert​编辑 4.确认回退 ​5.仓库回退成功 在使用…

融资项目——代码生成器

public void GenCode(){// 1、创建代码生成器AutoGenerator mpg new AutoGenerator();// 2、全局配置GlobalConfig gc new GlobalConfig();String projectPath System.getProperty("user.dir");gc.setOutputDir(projectPath "/src/main/java");gc.setA…

The Cherno C++笔记02

目录 Part 06 How the C Compiler Works 1.编译过程 2.C并不关心文件 3.翻译单元&#xff08;Translation Unit&#xff09; 4. 实际用代码感受一下编译过程 4.1 预处理 4.1.1 预处理的本质 4.1.2 预处理后的.i文件 4.1.3 骚操作 4.2 .asm文件&#xff08;汇编语言源文…

安装nodejs,配置环境变量并将npm设置淘宝镜像源

安装nodejs并将npm设置淘宝镜像源 1. 下载nodejs 个人不喜欢安装包&#xff0c;所以是下载zip包的方式。这里我下载的node 14解压包版本 下载地址如下&#xff1a;https://nodejs.org/dist/v14.15.1/node-v14.15.1-win-x64.zip 想要其他版本的小伙伴去https://nodejs.org/di…

黑豹程序员-读properties属性文件本地正常,打包jar后运行出错

读properties属性文件本地正常&#xff0c;打包jar后运行出错 java.io.FileNotFoundException:file:\D:\code\xml-load\target\XX.jar!\XXX(文件名、目录名或卷标语法不正确。)原因是读取方式不正确 当使用Spring Boot将应用打成jar时&#xff0c;需要读取resources目录下配置…

C++ 检测 是不是 com组件 的办法 已解决

在日常开发中&#xff0c;遇到动态库和 com组件库的调用 无法区分。检测是否com组件的办法 在头部文件&#xff0c;引入文件 如果能编译成功说明是 com组件&#xff0c;至于动态库如何引入&#xff0c;还在观察中 最简单办法 regsvr32 TerraExplorerX.dll 是com 组件 regs…

LLaMA开源大模型源码分析!

Datawhale干货 作者&#xff1a;宋志学&#xff0c;Datawhale成员 花了一晚上照着transformers仓库的LLaMA源码&#xff0c;把张量并行和梯度保存的代码删掉&#xff0c;只留下模型基础结构&#xff0c;梳理了一遍LLaMA的模型结构。 今年四月份的时候&#xff0c;我第一次接触…

OpenAI 疑似正在进行 GPT-4.5 灰度测试!

‍ 大家好&#xff0c;我是二狗。 今天&#xff0c;有网友爆料OpenAI疑似正在进行GPT-4.5灰度测试&#xff01; 当网友询问ChatGPT API调用查询模型的确切名称是什么时&#xff1f; ChatGPT的回答竟然是 gpt-4.5-turbo。 也有网友测试之后发现仍然是GPT-4模型。 这是有网友指…

自动化测试架构设计必会知识点——对核心业务进行封装复用(附Java源码)

随着UI自动化测试工具可选性越来越多&#xff0c;工具也越来越稳定&#xff0c;前几年关于自动化测试架构设计的概念逐渐淡化&#xff0c;但是做自动化测试最重要的两点—— PO设计模式和核心业务的封装复用大家还是必须掌握的&#xff0c;前面的文章我已经介绍了什么是PO设计模…

交叉熵损失(Cross Entropy Loss)学习笔记

在分类任务中&#xff0c;我们通常使用交叉熵作为损失函数&#xff0c;首先给出交叉熵的计算公式&#xff1a; 二分类中&#xff1a; L 1 N ∑ i L i 1 N ∑ i − [ y i l o g ( p i ) ( 1 − y i ) ⋅ l o g ( 1 − p i ) ] \mathcal{L}\frac1{N}\sum_{i}L_i\frac1{N}\sum…

基于 Sentry 的前端监控系统搭建(Linux)

一、前言 随着技术这几年的发展与沉淀&#xff0c;线上数据指标监控也变得尤为重要&#xff0c;研发人员和运营人员需要对线上的产品指标有所感知&#xff0c;同时风险也需要及时暴露&#xff0c;很多公司开始自建监控系统&#xff0c;但对于一些定制化要求不是特别高的团队&a…

【PHP】Yii2 使用validate规则验证

目录 提交验证 声明规则 特殊验证 一个特殊验证的示例 内联验证器 一个完整示例 参考文档 提交验证 根据经验&#xff0c;您永远不应该相信从最终用户那里收到的数据&#xff0c;并且应该在很好地使用这些数据之前对其进行验证。 给定一个model模型&#xff0c;用户输入填…

网络爬虫之Ajax动态数据采集

动态数据采集 规则 有时候我们在用 requests 抓取页面的时候&#xff0c;得到的结果可能和在浏览器中看到的不一样&#xff0c;在浏览器中可以看到正常显示的页面教据&#xff0c;但是使用 requests 得到的结果并没有&#xff0c;这是因为requests 获取的都是原始的 HTML 文档…

前端跨页面交互信息或传递信息都有这么几种方式,总有一个满足你的使用场景

同源页面通信&#xff1a; 方法&#xff1a;Broadcast Channel 【广播】 这个可以查看我另一篇文章有使用案例 同一来源的不同文档&#xff08;在不同的窗口、选项卡、框架或 iframe 中&#xff09;之间进行通信 // page1<!DOCTYPE html> <html lang"en"…

(1)(1.9) MSP (version 4.2)

文章目录 前言 1 协议概述 2 配置 3 参数说明 前言 ArduPilot 支持 MSP 协议&#xff0c;可通过任何串行端口进行遥测、OSD 和传感器。这样&#xff0c;ArduPilot 就能将遥测数据发送到 MSP 兼容设备&#xff08;如大疆护目镜&#xff09;&#xff0c;用于屏幕显示&#x…

(C)一些题15

1.下列关于 C 语言程序结构的说法中&#xff0c;不正确的是&#xff08;D) A &#xff0e;一个程序由一个或多个源程序文件组成 B &#xff0e;函数是 C 程序的主要组成部分 C &#xff0e;程序总是从 main 函数开始执行的 D . C 语言本身提供了许多输入输出语句 解析&…