【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>对案myList
	list<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 。

//在第一个元素的后一个位置加上元素0
	myList.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>对案myList
	list<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';
	//在第一个元素的后一个位置加上元素0
	myList.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;
}

今天就先到这了!!!

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

常见的核函数

在机器学习中&#xff0c;特别是在支持向量机&#xff08;SVM&#xff09;和其他基于核的方法中&#xff0c;核函数是一种用来计算数据点在高维空间中相对位置的方法。核函数能够使得算法在不显式地映射数据到高维空间的情况下&#xff0c;仍然能够处理线性不可分的数据。常见的…

RPC教程 6.负载均衡

1.负载均衡策略 假设有多个服务实例&#xff0c;而每个实例都提供相同的功能&#xff0c;为了提高整个系统的吞吐量&#xff0c;每个实例部署在不同的机器上。客户端可以选择任意一个实例进行调用&#xff0c;获取想要的结果。那如何选择呢&#xff1f;取决于负载均衡的策略。…

【WPF.NET开发】WPF中的双向功能

本文内容 FlowDirectionFlowDocumentSpan 元素非文本元素的 FlowDirection数字替换 与其他任何开发平台不同&#xff0c;WPF 具有许多支持双向内容快速开发的功能&#xff0c;例如&#xff0c;同一文档中混合了从左到右和从右到左的数据。 同时&#xff0c;WPF 也为需要双向功…

JVM基础知识汇总篇

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

企业计算机中了360后缀勒索病毒怎么办,360后缀勒索病毒解密流程

企业计算机服务器在生产运营过程中发挥着巨大作用&#xff0c;为企业带来极大便利&#xff0c;存储着企业的重要核心数据&#xff0c;但同时也成为众多勒索病毒攻击的目标。近期&#xff0c;云天数据恢复中心接到很多企业的求助&#xff0c;企业的计算机服务器遭到了360后缀勒索…

多文件开发

当所有的类都写在main.m这个源文件之中、将不利于后期的维护和团队开发 推荐的方式 把1个类写在1个模块之中&#xff0c;而1个模块至少包含两个文件 h头文件 1.写的类声明因为要用到Foundation框架中的类NS0 bject所以在这个头文件中要引入 Foundationa 2.框架的头文件 3.然后…

qemu搭建arm64 linux kernel环境

一、环境准备 ubuntu 22.04 内核源码&#xff1a;linux-6.6.1 &#xff08;直接上最新版&#xff09; 下载链接&#xff1a;The Linux Kernel Archives 交叉编译工具链&#xff1a; sudo apt-get install gcc-12-aarch64-linux-gnu 具体能用的版本gcc-XX-arch64-linux-gnu…

python_ACM模式《剑指offer刷题》链表2

题目&#xff1a; 例如 面试tips&#xff1a; 询问有无时间复杂度或空间复杂度的限制。 思路&#xff1a; 本题的本质就是复杂链表的深拷贝 1. 暴力解法 → 第一次遍历原链表时构建一个复制了next的新链表&#xff0c;第二次遍历原链表&#xff0c;对每个原链表的节点的ran…

幻兽帕鲁服务器多少钱?4核16G支持32人在线吗?

4核16G服务器是幻兽帕鲁Palworld推荐的配置&#xff0c;阿里云和腾讯云均推出针对幻兽帕鲁的4核16G服务器&#xff0c;阿里云4核16G幻兽帕鲁专属服务器32元1个月、66元3个月&#xff0c;腾讯云4核16G14M服务器66元1个月、277元3个月、1584元一年。云服务器吧yunfuwuqiba.com分享…

一、MongoDB、express的安装和基本使用

数据库【Sqlite3、MongoDB、Mysql】简介&小记 Sqlite3&#xff1a; SQLite3是一个轻量级的数据库系统&#xff0c;它被设计成嵌入式数据库。这意味着它是一个包含在应用程序中的数据库&#xff0c;而不是独立运行的系统服务。适用场景&#xff1a;如小型工具、游戏、本地…

node.js Redis SETNX命令实现分布式锁解决超卖/定时任务重复执行问题

Redis SETNX 命令背后的原理探究 当然&#xff0c;让我们通过一个简单的例子&#xff0c;使用 Redis CLI&#xff08;命令行界面&#xff09;来模拟获取锁和释放锁的过程。 在此示例中 获取锁: # 首先&#xff0c;设置锁密钥的唯一值和过期时间(秒) 127.0.0.1:6379> SET …

ChatGPT 官方中文页面上线

根据页面显示&#xff0c;OpenAI 现已推出 ChatGPT 的多语言功能 Alpha 版测试&#xff0c;允许用户选择不同语言的界面进行交互。 如下图所示&#xff0c;ChatGPT 会检测系统当前所使用的语言&#xff0c;并提示用户进行语言切换。 用户也可通过设置页面选择其他语言。目前&a…

企业转型:虚拟化对云计算的影响

虚拟化被认为是IT行业最优秀的技术之一。虚拟化提供的灵活性和效率&#xff0c;有助于企业根据不断变化的需求扩展其IT基础设施。虚拟化是云基础设施的基础&#xff0c;允许按需动态分配和管理计算资源。这种适应性对于满足现代企业的多样化需求至关重要&#xff0c;因为现代企…

深度学习之处理多维特征的输入

我们首先来看一个糖尿病的数据集&#xff1a; 在数据集中&#xff0c;我们称每一行叫做sample&#xff0c;表示一个样本&#xff0c;称每一列是feature&#xff0c;也就是特征在数据库里面这就是一个关系表&#xff0c;每一行叫做记录&#xff0c;每一列叫做字段。 每一个样本都…

山西电力市场日前价格预测【2024-01-29】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-01-29&#xff09;山西电力市场全天平均日前电价为279.99元/MWh。其中&#xff0c;最高日前电价为397.38元/MWh&#xff0c;预计出现在07:45。最低日前电价为0.00元/MWh&#xff0c;预计出…

【计算机专业学习委员必备自动化催作业通知】

文章目录 前言一、前期准备zfile部署mysql服务搭建 二、编写python脚本python代码 三、总结 前言 大家好&#xff01;我是一名计算机专业的菜鸟&#xff0c;作为这个专业的学习委员&#xff0c;我觉得收电子版作业是一件非常麻烦的事情&#xff0c;作业实验科目也比较多&#…

RLHF学习

整体流程 三个步骤分解&#xff1a; 预训练一个语言模型 (LM) &#xff1b;聚合问答数据并训练一个奖励模型 (Reward Model&#xff0c;RM) &#xff1b;用强化学习 (RL) 方式微调 LM。 RW RM 的训练是 RLHF 区别于旧范式的开端。这一模型接收一系列文本并返回一个标量奖励&…

探索Pyecharts关系图绘制技巧:炫酷效果与创意呈现【第42篇—python:Pyecharts水球图】

文章目录 Pyecharts绘制多种炫酷关系网图引言准备工作代码实战1. 基本关系网图2. 自定义节点样式和边样式3. 关系网图的层级结构4. 添加标签和工具提示5. 动态关系网图6. 高级关系网图 - Les Miserables 示例7. 自定义关系网图布局8. 添加背景图9. 3D 关系网图10. 热力关系网图…

使用PCL进行法向量可视化

使用PCL进行法向量可视化 文章目录 1、使用PCL进行法向量可视化2、计算所有点的法线并显示3、计算一个子集的法线 1、使用PCL进行法向量可视化 #include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/visualization/pcl_visualizer.h> #include &l…

Qt使用中文字符串乱码的问题

文章目录 vs编译器下第一种解决方式第二种解决方式 Qt编译器下 我们在使用qt的时候有时候会遇到打印中文字符串的时候出现中文乱码的问题&#xff0c;主要是由于Qt的QString字符串存储的方式是使用utf-8的编码方式&#xff0c;如果我们本地的文件是使用GBK方式的编码再使用中文…
最新文章