第九层(7):STL之list

news2024/11/9 5:45:27

文章目录

  • 前情回顾
  • list
    • 概念
    • 优缺点
    • 构造函数
    • 赋值函数
    • 交换函数
    • 容器和大小操作
    • 插入操作
    • 删除操作
    • 单个数据访问
    • 反转操作
    • 排序
  • 下一座石碑

🎉welcome🎉
✒️博主介绍:一名大一的智能制造专业学生,在学习C/C++的路上会越走越远,后面不定期更新有关C/C++语法,数据结构,算法,Linux,ue5使用,制作游戏的心得,和大家一起共同成长。
✈️C++专栏:C++爬塔日记
😘博客制作不易,👍点赞+⭐收藏+➕关注

前情回顾

在上一块石碑中,我学到了queue,同时下一块石碑也显露出来…

  • 🚄上章地址:第九章(6):STL之queue

list

概念

  • list可以将数据链式存储,list也就是链表,链表是由一系列的节点组成,节点是内部有两块区域,一个是存放下一个节点地址的指针域,一个是存放数据的数据域,链表可以对任意位置进行快速的插入和删除,但是因为链表不是一块连续的空间,所以遍历的速度慢于数组,并且占用空间比数组要大,list的本质就是一个双向循环链表,双向循环列表指的就是,第一个节点记录着最后的位置,最后一个节点记录第一个节点的位置

在这里插入图片描述

  • 由于链表的储存方法不是连续空间,所以list的迭代器只支持前移和后移,属于双向迭代器,不能随机访问

优缺点

  • 优点:
    1. 采用动态存储分配,不会造成内存的浪费和溢出
    2. list的插入和删除十分方便,只需要修改指针就可以,不需要移动内部的大量数据
    3. list的插入和删除不会造成原有的迭代器失效,而vector不行,因为vector在插入扩展的时候,会找一片新空间将数据拷贝过去,
  • 缺点:
    1. 相比较数组而言,链表所占用的空间较大,遍历消耗的额外时间较多

构造函数

  • list中的构造函数与vector一样,有四个构造函数
list< T >;//;默认构造函数
list(beg,end);//将迭代器beg到end之间的数据拷贝到本身
list(size_t n,T elem);//将n个elem赋值给本身
list(const list &l);//将l的元素拷贝到本身

使用:

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

void print(list<int>& l)
{
	for (list<int>::iterator b=l.begin(); b != l.end(); b++)
	{
		cout << *b << " ";
	}
	cout << endl;
}
void test1()
{
	list<int> l;
	list<int> l1(10, 1);
	print(l1);
	list<int>l2(l1);
	print(l2);
	list <int>l3(l1.begin(), l1.end());
	print(l3);
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述

赋值函数

  • list中的赋值操作与vector中也是一样的,有三种
list& operator=(const list &l);//操作符重载
assign(beg,end);//将迭代器beg到end的数据拷贝到本身
assign(int n,T elem);//将n个elem拷贝到本身

使用:

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

void print(list<int>& l)
{
	for (list<int>::iterator b=l.begin(); b != l.end(); b++)
	{
		cout << *b << " ";
	}
	cout << endl;
}
void test1()
{
	list<int> l(10, 1);
	print(l);
	list<int> l1;
	l1 = l;
	print(l1);
	list<int> l2;
	l2.assign(l1.begin(),l1.end());
	print(l2);
	list<int> l3;
	l3.assign(10, 2);
	print(l3);
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述

交换函数

  • 与vector一样,可以利用swap函数进行交换
swap(list< T > &l);//将l的数据和本身进行交换

使用:

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

void print(list<int>& l)
{
	for (list<int>::iterator b=l.begin(); b != l.end(); b++)
	{
		cout << *b << " ";
	}
	cout << endl;
}
void test1()
{
	cout << "交换前" << endl;
	list<int> l(10, 1);
	print(l);
	list<int> l1;
	l1.assign(10, 2);
	print(l1);
	cout << "交换后" << endl;
	l.swap(l1);
	print(l);
	print(l1);
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述

容器和大小操作

  • list比vector少一个容器大小,因为list的空间不是连续的,数据存放方式也与vector不同,有多少元素大小就多少,和vector不一样,所以不需要
size();//返回容器内元素个数
empty();//判断容器是否为空,为空返回真
resize(size_t num);///可以重新指定容器的容量,容量为num,若容器变长,则变长的部分全部补0,若变短,则将超出的部分全部删除
reszie(size_t num,T elem);//可以重新指定容器的容量,容量为num,若容器变长,则变长的部分全部补elem,若变短,则将超出的部分全部删除

使用:

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

void print(list<int>& l)
{
	for (list<int>::iterator b=l.begin(); b != l.end(); b++)
	{
		cout << *b << " ";
	}
	cout << endl;
}
void test1()
{
	list<int> l;
	if (l.empty())
	{
		cout << "l为空" << endl;
	}
	cout << l.size() << endl;
	l.assign(10, 1);
	print(l);
	l.resize(11);
	print(l);
	l.resize(15, 1);
	print(l);
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述

插入操作

  • list中,有五种插入操作,可以从头部插入,从尾部插入,还有insert的三个重载版本
push_front(T elem);//在头部插入elem
push_end(T elem);//在尾部插入elem
insert(pos,T elem);//在pos的位置插入一个elem,返回新数据的位置
insert(pos, size_t n,T elem);//在pos位置插入n个elem
insert(pos,beg,end);//在pos位置插入迭代器beg到end的数据

使用:

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

void print(list<int>& l)
{
	for (list<int>::iterator b=l.begin(); b != l.end(); b++)
	{
		cout << *b << " ";
	}
	cout << endl;
}
void test1()
{
	list<int> l;
	l.push_back(2);
	print(l);
	l.push_front(1);
	print(l);
	l.insert(l.end(), 3);
	print(l);
	l.insert(l.begin(), 1,0);
	print(l);
	list<int>::iterator b = l.begin();
	b++;
	l.insert(b, l.begin(), l.end());
	print(l);
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述

删除操作

  • 删除操作有六个,向比较vector多了头部的删除,和一个删除一样元素的删除
pop_back();//删除尾部元素
pop_front();//删除头部元素
clear();//删除全部元素
erase(beg,end);//删除迭代器beg到end之间的数据
erase(pos);//删除迭代器pos位置的数据,返回下一个元素的位置
remove(T elem);//删除容器中所有的elem

使用:

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

void print(list<int>& l)
{
	for (list<int>::iterator b=l.begin(); b != l.end(); b++)
	{
		cout << *b << " ";
	}
	cout << endl;
}
void test1()
{
	list<int> l;
	for (int i = 0; i < 10; i++)
	{
		l.push_back(i);
		l.push_back(i);
	}
	print(l);
	l.pop_back();
	print(l);
	l.pop_front();
	print(l);
	list<int>::iterator b = l.begin();
	b++; b++; b++;
	l.erase(b);
	print(l);
	list<int>::iterator b1 = l.begin();
	b1++; b1++; b1++;
	l.erase(b1, l.end());
	print(l);
	l.remove(1);
	print(l);
	l.clear();
	print(l);
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述

单个数据访问

  • 因为在list中空间不是连续的,同时,list的迭代器也不支持随机访问,所以对于list来说[ ]和at是不适用于list的,可以利用迭代器++或者–来访问其他元素
front();//返回第一个元素
back();//返回最后一个元素

使用:

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

void print(list<int>& l)
{
	for (list<int>::iterator b=l.begin(); b != l.end(); b++)
	{
		cout << *b << " ";
	}
	cout << endl;
}
void test1()
{
	list<int> l;
	for (int i = 0; i < 10; i++)
	{
		l.push_back(i);
	}
	print(l);
	cout << l.front() << endl;
	cout << l.back() << endl;
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述

反转操作

  • 在list中可以反转链表,就是让链表中所有元素交换位置,后面的与前面的交换。
reverse();//反转链表

使用:

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

void print(list<int>& l)
{
	for (list<int>::iterator b=l.begin(); b != l.end(); b++)
	{
		cout << *b << " ";
	}
	cout << endl;
}
void test1()
{
	list<int> l;
	for (int i = 0; i < 10; i++)
	{
		l.push_back(i);
	}
	cout << "反转前" << endl;
	print(l);
	cout << "反转后" << endl;
	l.reverse();
	print(l);
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述

排序

  • 在容器当中,可以使用一个算法函数来对容器内的数据进行一个排序,默认从小到大,但是是对于支持随机访问的迭代器,可以使用标准算法,对于list这种不支持随机访问的迭代器,是不可以用标准算法的,只能用类内的算法
sort();//排序

使用:

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

void print(list<int>& l)
{
	for (list<int>::iterator b=l.begin(); b != l.end(); b++)
	{
		cout << *b << " ";
	}
	cout << endl;
}
void test1()
{
	list<int> l;
	for (int i = 9; i >=0; i--)
	{
		l.push_back(i);
	}
	print(l);
	l.sort();
	print(l);
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述

  • 那想从大到小排呢?这个时候需要一个函数,函数返回类型为bool,内部可以让传参的两个参数进行比较,任何前者大于后者,返回真,如果小于返回假,返回假就会进行交换
#include<iostream>
#include<list>
using namespace std;

void print(list<int>& l)
{
	for (list<int>::iterator b=l.begin(); b != l.end(); b++)
	{
		cout << *b << " ";
	}
	cout << endl;
}
bool com(int a, int b)
{
	return a > b;//可以简化成这样,返回的是a>b的结果,如果结果是对的,不进行交换,如果不对,进行交换
}
void test1()
{
	list<int> l;
	for (int i = 0; i < 10; i++)
	{
		l.push_back(i);
	}
	print(l);
	l.sort(com);
	print(l);
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述

下一座石碑

  • 这座石碑倒下了,露出了下一座石碑…

😘预知后事如何,关注新专栏,和我一起征服C++这座巨塔
🚀专栏:C++爬塔日记
🙉都看到这里了,留下你们的👍点赞+⭐收藏+📋评论吧🙉

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

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

相关文章

C++——map|set2

目录 map::operator[] [ ]的实现 multimap 习题 前K个高频单词 两个数组的交集 底层结构 pair有俩个成员一个是first,一个是second 由于pair有俩个模板参数&#xff0c;第一个是first&#xff0c;一个是second map的insert参数类型是valud_type,value_type就是pair …

PNG免抠素材网,免费商用,设计师赶紧马住。

本期分享设计师必备的免抠素材网站&#xff0c;建议收藏&#xff01; 1、菜鸟图库 https://www.sucai999.com/searchlist/66008.html?vNTYwNDUx 网站主要分享设计类素材为主&#xff0c;有平面海报、UI素材、电商素材、免抠素材、背景图片等等。其中免抠元素数量就非常可观&a…

uniapp项目

目录 一、HBuilder创建项目 二、引入uView 2.1 npm方式安装 2.2 下载方式安装 三、小程序的分包 三、App.vue中的生命周期 四、工具封装 五、api接口请求封装 六、store 七、加载顺序 八、flex的使用 一、HBuilder创建项目 文件--新建--项目--默认模板--Vue2--创建 …

CRLFsuite:一款功能强大的CRLF注入扫描工具

关于CRLFsuite CRLFsuite是一款功能强大的CRLF注入扫描工具&#xff0c;在该工具的帮助下&#xff0c;广大研究人员可以轻松扫描和识别目标应用程序中的CRLF注入漏洞。 关于CRLF 回车换行&#xff08;CRLF&#xff09;注入攻击是一种当用户将CRLF字符插入到应用中而触发漏洞…

“华为杯”研究生数学建模竞赛2005年-【华为杯】A题:排队论模型解决出租车最佳数量预测(附获奖论文)

赛题描述 A: Highway Traveling time Estimate and Optimal Routing Ⅰ Highway traveling time estimate is crucial to travelers. Hence, detectors are mounted on some of the US highways. For instance, detectors are mounted on every two-way six-lane highways o…

jsp 大学生心理平台系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 jsp大学生心理平台系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统采用web模式开发&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境 为TOMCAT7.0,Myeclipse8.5开发&#x…

正点原子STM32(基于HAL库)4

目录ADC 实验ADC 简介单通道ADC 采集实验ADC 寄存器硬件设计程序设计(还没拷贝完)单通道ADC 采集&#xff08;DMA 读取&#xff09;实验ADC & DMA 寄存器硬件设计多通道ADC 采集&#xff08;DMA 读取&#xff09;实验ADC 寄存器硬件设计单通道ADC 过采样&#xff08;16 位分…

【数据结构初阶】第二篇——顺序表

顺序表的概念及其结构 初始化顺序表 销毁顺序表 打印顺序表 增加数据 头插 尾插 指定下标位置插入 删除数据 头删 尾删 删除指定位置 查找数据 修改数据 顺序表的概念及其结构 基本概念 顺序表是用一段物理地址连续的存储单元一次存储数据元素的线性结构&#xf…

Word控件Spire.Doc 【Table】教程(6): 在 Word 中合并或拆分表格单元格

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

AcWing 1072. 树的最长路径(DFS与树形DP)

AcWing 1072. 树的最长路径&#xff08;树形DP&#xff09;一、题目&#xff1a;二、思路&#xff1a;三、代码&#xff1a;四、树形DP1、状态表示2、状态转移3、循环设计4、初末状态5、代码实现一、题目&#xff1a; 二、思路&#xff1a; 为了方便&#xff0c;我们利用下面这…

Vue3现状—必然趋势?

文章目录&#x1f31f; 专栏介绍&#x1f31f; Vue默认版本&#x1f31f; 拥抱Vue3的UI&#x1f31f; Vue3显著优势&#x1f31f; 专栏介绍 凉哥作为 Vue 的忠诚粉丝输出过大量的 Vue 文章&#xff0c;应粉丝要求开始更新 Vue3 的相关技术文章&#xff0c;Vue 框架目前的地位大…

Python爬虫之Scrapy框架系列(8)——XXTop250电影所有信息同时存储到MySql数据库

现在又不满足于只保存在本地txt文本了&#xff0c;所以来试试存储到数据库mysql里怎么搞呢&#xff1f;&#xff08;首先&#xff0c;要准备好mysql数据库以及navicat数据库可视化管理工具&#xff09; 目录&#xff1a;分析&#xff1a;如何同时存储到本地txt文本以及mysql数据…

回溯详解 LeetCode 46. 全排列 51. N 皇后 52. N皇后 II

&#x1f308;&#x1f308;&#x1f604;&#x1f604; 欢迎来到茶色岛独家岛屿&#xff0c;本期将为大家揭晓LeetCode 46. 全排列 51. N 皇后 52. N皇后 II&#xff0c;做好准备了么&#xff0c;那么开始吧。 &#x1f332;&#x1f332;&#x1f434;&#x1f434; 46. 全…

Word处理控件Aspose.Words功能演示:如何在 C# 和Java中将 DOC 转换为 JSON

Aspose.Words 是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作任务。API支持生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现和打印文档&#xff0c;而无需在跨平台应用程序中直接使用Microsoft Word。此外&#xff0c; Aspose API支持流行文件格式处…

kvm磁盘管理

kvm磁盘管理虚拟磁盘类型rawqcow2qemu-img常用参数主要参数&#xff1a;查看磁盘信息--info创建磁盘文件--create磁盘容量调整--resize磁盘增加容量磁盘缩小容量(生产环境下禁止操作)磁盘调整容量到指定大小转换磁盘格式--convert检查磁盘镜像在线热添加磁盘附加磁盘到vm实例--…

UI自动化测试面试题总结

文章目录一、请描述实现用户登陆模拟自动化测试的思路。二、基于Web端呈现的产品如何做自动化测试&#xff0c;谈谈你的思路和方向。三、什么是web自动化测试&#xff1f;四、什么是selenium&#xff1f;五、写出selenium中你最熟悉的接口或类(*)六、findElement()和findElemen…

java总结(数组)

1.数组概述数组&#xff08;Array&#xff09;是多个相同数据类型按照一定顺序排列的集合&#xff0c;并使用一个名字命名&#xff0c;通过编号的方式对这些数据进行统一的管理。数组相关概念数组名&#xff1a;下标&#xff08;索引&#xff09;元素数组长度数组特点有序排列数…

sqlserver将mdf文件拆分成多个ndf文件

sqlserver版本&#xff1a;2008R2 1、为什么要拆分 数据库在运行一段时间后mdf文件会迅速增大&#xff0c;这会导致查询速度变慢。或者mdf文件的大小达到了操作系统允许的最大大小&#xff0c;这个时间就必须要进行拆分了。 2、拆分的好处 在没有拆分的时候只有一个mdf主数…

KVM虚拟化技术学习笔记10

虚拟机镜像管理 学习目标&#xff1a; 能够了解KVM虚拟机支持的镜像格式 能够使用qemu-img实现镜像创建 能够使用qemu-img实现镜像查看 能够使用qemu-img实现镜像格式转换 能够了解后备镜像的作用 能够了解差量镜像的作用 能够基于后备镜像制作差量镜像 能够使用差量镜…

SAP ADM100-2.3 系统启动:AS ABAP和AS ABAP+JAVA

一、打开并停止一个SAP Netweaver AS ABAP+JAVA 使用例如SAP MC(SAP Management Console)工具开启并关闭实例。在一个双栈实例中(ABAP+JAVA),JAVA是通过ABAP dispatcher使用Startup and Control Framework开启的,然后它再开启JAVA dispatcher和SP(server Processes)。 …