当前位置: 首页 > news >正文

【C++修行之道】STL(初识list、stack)

目录

一、list

1.1list的定义和结构

以下是一个示例,展示如何使用list容器:

1.2list的常用函数

1.3list代码示例

二、stack

2.1stack的定义和结构

stack的常用定义

2.2常用函数

2.3stack代码示例


一、list

1.1list的定义和结构

  • list的使用频率不高,在做题时极少遇到需要使用list的情景。
  • ist是一种双向链表容器,它是标准模板库(STL)提供的一种序列容器。
  • list容器以节点(node)的形式存储元素,并使用指针将这些节点链接在一起,形成一个链表结构。
  • list容器的定义和结构如下:
template <class T, class Allocator = std::allocator<T>>class list;

list容器模板接受两个参数:

  1. T:指定容器中存储的元素类。
  2. Allocator (可选):指定用于分配内存的分配器类型,默认为std::allocator<T>。

list容器的特点包括:

  • 双向性:每个节点都包含指向前一个节点和后一个节点的指针,因此可以在常数时间内在链表中的任意位置进行插入、删除和访问操作。
  • 动态大小: 链表的大小可以根居需要动态扩展或收缩,不需要预先指定容器的大小
  • 不连续存储:链表中的节点可以在内存中的任意位置分布,不要求连续存储因此插入和删除操作不会导致元素的移动。
  • list与其他标准序列容器(array,vector和deque)相比,list通常可以在容器内的任何位置插入、提取和移动元素。
  • list与其他标准序列容器(array,vector和deque)相比,list和forward_list(单链表实现)的主要缺点是他们不能通过位置直接访问元素;例如,要访问列表中的第五个元素,必须从已知位置(开始或结束)迭代到该位置,需要线性时间开销。
  • 存储密度低,list要使用一些额外的内容空间(next,prev)来保持与每个元素相关联(前后续的线性)的链接信息,从而导致存储小元素类型(如char,short,int等)的列表的存储密度低。

list容器提供了一系列成员函数和迭代器来操作和访问链表中的元素,包括插入、删除、访问、反转等操作。可以使用迭代器来遍历链表中的元素。

以下是一个示例,展示如何使用list容器:

#include<iostream>
#include<list>using namespace std;int main()
{list<int> myList;//在链表尾部插入元素myList.push_back(1);myList.push_back(2);myList.push_back(3);//在链表头不插入元素myList.push_front(0);//遍历链表并输出元素for (int num : myList) {cout << num << " ";}cout << endl;return 0;
}

  • 在上述示例中,我们首先创建了一个list容器myList,然后使用push_back()和push_front()函数分别在链表尾部和头部插入元素。最后,使用范围基于范围的for循环遍历链表并输出元素。
  • 需要注意的是,由于list是双向链表,因此插入和删除操作的时间复杂度是常量时间O(1),但访问和查找操作的时间复杂度是线性时间O(n),其中n是链表的大小。因此,如果需要频繁进行随机访问操作,可能更适合使用支持随机访问的容器,如vector或deque。

随机访问:begin()+idex,得到迭代器

1.2list的常用函数

list容器提供了多个常用的成员函数来操作和访问链表中的元素以下是一些常用的list函数的解释:

  1. push _back():将元素插入到链表的末尾。
  2. push front():将元素插入到链表的开头。
  3. pop back():移除链表末尾的元素。
  4. pop_front():移除链表开头的元素。
  5. size():返回链表中元素的个数。
  6. empty():检查链表是否为空。
  7. clear():清空链表中的所有元素。
  8. front():返回链表中第一个元素的引用。
  9. back():返回链表中最后一个元素的引用。
  10. begin(): 返回指向链表第一个元素的迭代器。
  11. end(): 返回指向链表末尾的下一个位置的迭代器。
  12. insert():在指定位置之前插入一个或多个元素。
  13. .erase():从链表中移除指定位置的一个或多个元素。

1.3list代码示例

在代码中,我们向myList的尾部添加了5个元素,从1到5。

int main()
{//创建一个List<int>对案myListlist<int> myList;//向myList尾部添加元素for (int i = 1; i <= 5; ++i){myList.push_back(i);}

然后,我们使用范围for循环遍历myList并输出其中的元素。输出结果为:1 2 3 4 5 。

// 从头到尾输出myList中的元素for (const auto& i : myList)cout << i << ' ';cout << '\n';

使用reverse函数将myList中的元素反转,并输出反转后的结果。输出为:5 4 3 2 1 。

//将myList中的元素反转reverse(myList.begin(), myList.end());for (const auto& i : myList)cout << i << ' ';cout << '\n';

再使用myList.begin()获取链表的第一个迭代器,然后使用++操作符将其移动到第二个元素的位置。接着,我们使用insert函数在这个位置插入元素0。输出结果为:5 0 4 3 2 1 。

//在第一个元素的后一个位置加上元素0myList.insert(++myList.begin(), 0);

删除链表中的一部分元素。++++myList.begin()将迭代器移动到链表的第三个元素,而--myList.end()将迭代器移动到链表的倒数第二个元素之前的位置。因此,这行代码将删除从第三个元素到倒数第二个元素之间的所有元素。

for (const auto& i : myList)cout << i << ' ';cout << '\n';myList.erase(++++myList.begin(), -- myList.end());//输出myList的大小cout << "链表大小为: " << myList.size() << '\n';//从头到尾输出myList中的元素for (const auto& i : myList)cout << i << ' ';cout << '\n';
int main()
{//创建一个List<int>对案myListlist<int> myList;//向myList尾部添加元素for (int i = 1; i <= 5; ++i){myList.push_back(i);}// 从头到尾输出myList中的元素for (const auto& i : myList)cout << i << ' ';cout << '\n';//将myList中的元素反转reverse(myList.begin(), myList.end());for (const auto& i : myList)cout << i << ' ';cout << '\n';//在第一个元素的后一个位置加上元素0myList.insert(++myList.begin(), 0);for (const auto& i : myList)cout << i << ' ';cout << '\n';myList.erase(++++myList.begin(), -- myList.end());//输出myList的大小cout << "链表大小为: " << myList.size() << '\n';//从头到尾输出myList中的元素for (const auto& i : myList)cout << i << ' ';cout << '\n';
}

二、stack

2.1stack的定义和结构

在C++中,stack是一个标准库容器,它提供了后进先出(LIFO, Last In First Out)的数据结构。stack容器只允许在序列的同一端(称为栈顶)进行插入和删除操作。stack没有迭代器,因此你不能像遍历其他容器(如vector或list)那样遍历stack。相反,你只能查看栈顶元素、向栈中添加元素或从栈中移除元素。

stack提供了一组函数来操作和访问元素,但它的功能相对较简单。stack的定义和结构如下 (仅作了解即可):

template <class T, class Container = deque<T>>
class stack;

T:表示存储在stack中的元素的类型

Container: 表示底层容器的类型,默认为deque。也可以使用其他容器类型,如vector或list、stack的内部实现使用了底层容器来存储元素,并且只能通过特定的函数来访问和操作元素。

stack的常用定义

//stack的定义 
stack<int>s1; //定义一个储存数据类型为int的stack容器s1 
stack<double>s2; //定义一个储存数据类型为double的stack容器s2
stack<string>s3; //定义一个储存数据类型为string的stack容器s3
stack<结构体类型>s4; //定义一个储存数据类型为结构体类型的stack容器s4
stack<int> s5[N]; //定义一个储存数据类型为int的stack容器数组,N为大小 
stack<int> s6[N]; //定义一个储存数据类型为int的stack容器数组,N为大小 

2.2常用函数

stack不能遍历

函数描述时间复杂度
push(x)在栈顶插入元素 x0(1)
pop弹出栈顶元素
 
0(1)
top返回栈顶元素
 
0(1)
empty检查栈是否为空
 
0(1)
size返回栈中元素的个数0(1)

小tips: 如果将一个数组的元素依次放入栈,再依次取出,则可以将数组翻转。

2.3stack代码示例

#include<iostream>
#include<stack>using namespace std;int main()
{stack<int>myStack;//向栈中插入元素myStack.push(10);myStack.push(20);myStack.push(30);myStack.push(40);//获取栈顶元素cout << "栈顶元素" << myStack.top() << endl;//弹出栈顶元素myStack.pop();//再次获取栈顶元素cout << "弹出一个元素后的栈顶元素" << myStack.top() << endl;//检查栈是否为空if (myStack.empty()) {cout << "栈为空" << endl;}else {cout << "栈不为空" << endl;}//获取栈的大小cout << "栈的大小" << myStack.size() << endl;return 0;
}

今天就先到这了!!!

看到这里了还不给博主扣个:
⛳️ 点赞☀️收藏 ⭐️ 关注!

你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。

相关文章:

【C++修行之道】STL(初识list、stack)

目录 一、list 1.1list的定义和结构 以下是一个示例&#xff0c;展示如何使用list容器: 1.2list的常用函数 1.3list代码示例 二、stack 2.1stack的定义和结构 stack的常用定义 2.2常用函数 2.3stack代码示例 一、list 1.1list的定义和结构 list的使用频率不高&#…...

【环境配置】安装了pytorch但是报错torch.cuda.is_availabel()=Flase

解决思路&#xff1a;import torch正常&#xff0c;说明torch包安装正常&#xff0c;但是不能和gpu正常互动&#xff0c;猜测还是pytroch和cuda的配合问题 1.查看torch包所需的cuda版本 我的torch是2.0.1&#xff0c;在现在是比较新的包&#xff0c;需要12以上的cuda支持&…...

什么是模板方法模式?它的实现方式有哪些?

什么是模板方法模式&#xff1f;它的实现方式有哪些&#xff1f; 模板方法模式是一种行为型模式&#xff0c;它定义了一个操作中的算法骨架&#xff0c;而将算法的一些步骤延迟到子类中实现&#xff0c;使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。 模…...

java:实现查询MySQL数据库中的数据,并导出excel、pdf类型文档(超详细)

查询MySQL数据库中数据&#xff0c;导出excel、pdf类型文档 1.数据库表格 CREATE TABLE user (id int NOT NULL AUTO_INCREMENT COMMENT 编号,name varchar(255) DEFAULT NULL COMMENT 姓名,age int DEFAULT NULL COMMENT 年龄,addr varchar(255) DEFAULT NULL COMMENT 住址1…...

Java后端须知的前端知识

Java后端须知的前端知识 HTML &#xff08;超文本标记语言&#xff09; W3C标准 结构&#xff1a;HTML表现&#xff1a;CSS行为&#xff1a;JavaScript 快速入门 <html><head><title></title></head><body><font color"red&q…...

Servlet基础之URL匹配规则

文章目录 URL 匹配规则几个容易混淆的规则精确匹配路径匹配扩展名匹配缺省匹配注意事项 1&#xff1a;匹配规则不能混用注意事项 2&#xff1a;"\/\*" 和 "/" 含义并不相同 URL 匹配规则 几个容易混淆的规则 servlet 容器中的匹配规则既不是简单的通配&am…...

【面试真题】Javascript 实现多条件过滤数组

场景&#xff1a; 有这么一个数组 [{a,123,b:345,c:456,d:t12},{a,234,b:345,c:thf2,d:t12}], 现在希望能够通过逗号分隔搜索值的输入方式&#xff0c;从数组中过滤出模糊匹配的数组元素。 解析&#xff1a; 可以使用 JavaScript 的 filter 函数和 indexOf 函数来实现这个功…...

spark广播变量

2024-1-24 广播变量特点 Broadcast Variable会将使用到的变量&#xff0c;只会为每个节点拷贝一份&#xff0c;不会为每个task进行拷贝&#xff0c;能够优化性能&#xff08;在task数量比较大体现更明显&#xff09;&#xff0c;减少网络传输及内存消耗通过SparkContext的bro…...

如何让wordpress首页只显示某一篇文章全部内容?在您的主页显示选择

大多数WordPress站点首页默认都是显示最新发布的文章列表&#xff0c;不过有些站点比较特殊&#xff0c;只想显示某一篇文章的全部内容&#xff0c;那么应该怎么设置呢&#xff1f; 其实&#xff0c;WordPress后台 >> 设置 >> 阅读 >> 在“您的主页显示”中…...

Git怎样用?(下载到本地,和在本地初始化)

全局设置&#xff1a; 点击第二个 输入&#xff1a; 例如&#xff1b;邮箱是随意地 git config --global user.name "名字" git config --global user.email "邮箱" 获取git仓库 本地初始化&#xff1a; 创建仓库 右键第二个 输入 git init 克隆&#…...

JVM基础知识汇总篇

☆* o(≧▽≦)o *☆嗨~我是小奥&#x1f379; &#x1f4c4;&#x1f4c4;&#x1f4c4;个人博客&#xff1a;小奥的博客 &#x1f4c4;&#x1f4c4;&#x1f4c4;CSDN&#xff1a;个人CSDN &#x1f4d9;&#x1f4d9;&#x1f4d9;Github&#xff1a;传送门 &#x1f4c5;&a…...

马哈鱼SQLFlow Lite的python版本

Gudu SQLFlow 是一款用来分析各种数据库的 SQL 语句和存储过程来获取复杂的数据血缘关系并进行可视化的工具。 Gudu SQLFlow Lite version for python 可以让 python 开发者把数据血缘分析和可视化能力快速集成到他们自己的 python 应用中。 Gudu SQLFlow Lite version for p…...

【原创】VMware创建子网,并使用软路由获得访问互联网的能力,并通过静态路由让上层网络访问位于虚拟机的子网

前言 一看标题就很离谱&#xff0c;确实内容也有点复杂&#xff0c;我的初衷是为后面搞软路由做准备&#xff0c;先通过VMware进行可行性验证&#xff0c;确定方案是否可行&#xff0c;再做下一步的计划。结论当然可以的&#xff0c;能通能访问&#xff0c;强的不行。 网络拓…...

华为和思科各数通设备的常用命令

本文基于华为和思科各数通设备的常用命令来对比学习,这两个命令体系是网络项目中常见的,其他一些厂家也是基于类似的命令体系.下面也会根据公司业务需求列举部分网络设备厂家,比如H3C,盛科的命令不同之处. 1. 查看命令 华为: <Quidway>dis cur …...

Qt Excel读写 - QXlsx的安装配置以及测试

Qt Excel读写 - QXlsx的安装配置以及测试 引言一、安装配置二、简单测试 引言 Qt无自带的库处理Excel 文件&#xff0c;但可通过QAxObject 借助COM接口进行Excel的读写1。亦可使用免费的开源第三方库&#xff1a;QXlsx&#xff0c;一个基于Qt库开发的用于读写Microsoft Excel文…...

【报错处理】ModuleNotFoundError: No module named ‘paddle.fluid‘

引言 在使用 UIE&#xff08;统一信息提取&#xff09;模型时&#xff0c;您可能会遇到错误消息 "ModuleNotFoundError: No module named paddle.fluid"。这个错误可能让人沮丧&#xff0c;但通常很容易解决。在本博客文章中&#xff0c;我将为您介绍解决此问题。 一…...

Wpf 使用 Prism 实战开发Day16

客户端使用RestSharp库调用WebApi 动态加载数据 在MyDoTo客户端中&#xff0c;使用NuGet 安装两个库 RestSharp Newtonsoft.Json 一. RestSharp 简单的使用测试例子 当前章节主要目的是&#xff1a;对RestSharp 库&#xff0c;根据项目需求再次进行封装。下面先做个简单的使用…...

八斗学习笔记

1 初始环境安装 Anaconda安装(一款可以同时创建跟管理多个python环境的软件) https://blog.csdn.net/run_success/article/details/134656460 Anaconda创建一个新python环境(安装人工智能常用的第三方python包&#xff0c;如&#xff1a;tensorflow、keras、pytorch) https://…...

【Uni-App】Vuex在vue3版本中的使用与持久化

Vuex是什么 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。 简而言之就是用来存数据&#xff0c;可以有效减少使用组件传参出现的问题。 基本元素&#xff1a;…...

基于Qt 音乐播放器mp3(进阶)

​## 项目工具 工具名QtQt 5.14.2图标设计Adobe Ai音频素材剪映平台windowsgif录制ScreenGif录屏Win10 自带录屏 Win + G## 项目演示 先点击构建项目,项目构建完成后,再将本例的 myMusic 歌曲文件夹拷贝到可执行程序...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...