list(链表)容器的规则及list的高级排序案例

news2024/11/15 21:47:41

1.list的基本概念:

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

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

链表是由一系列节点组成,节点的组成包含存储数据元素的数据域和存储下一个节点地址的指针域

STL中的链表是一个双向循环链表

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

list的优点:采用动态存储分配,不会造成内存浪费和溢出

链表执行插入和删除操作十分方便,修改指针即可,不需要像容器那样移动大量元素

list的缺点:链表更灵活,但空间(指针)和时间(遍历)额外耗费较大

list的重要性质,插入操作和删除操作都不会造成原有list迭代器的失效,这在vector中是不成立的(vector插入元素大于开始容量时,会进行深拷贝,原有迭代器会失效)

注意:STL中list和vector容器是最常被使用的容器,各有优缺点

 2.list的构造函数

void Print_List(const list<int> L)
{
	for (list<int>::const_iterator it = L.begin(); it != L.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}
void test01()//list的操作
{
	//1
	list<int> L1;
	L1.push_back(10);
	L1.push_back(20);
	L1.push_back(30);
	L1.push_back(40);
	L1.push_back(50);
	L1.push_front(5);
	Print_List(L1);
	//2
	list<int> L2(L1.begin(), L1.end());
	Print_List(L2);
	//3
	list<int> L3(5, 100);
	Print_List(L3);
	//4
	list<int> L4(L3);
	Print_List(L4);
}

 3.list的赋值和交换操作

 

void Print_List(const list<int> L)
{
	for (list<int>::const_iterator it = L.begin(); it != L.end(); it++)
	{
		cout << *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);
	L1.push_back(50);
	L1.push_front(5);
	Print_List(L1);
	//1
	list<int> L2;
	L2.assign(L1.begin(), L1.end());
	Print_List(L2);
	//2
	list<int> L3;
	L3.assign(5, 100);
	Print_List(L3);
	//3
	list<int> L4;
	L4 = L3;
	Print_List(L4);
}
void test02()//list的交换操作
{
	list<int> L1;
	L1.push_back(10);
	L1.push_back(20);
	L1.push_back(30);
	L1.push_back(40);
	L1.push_back(50);
	L1.push_front(5);
	list<int> L2(5, 100);
	cout << "交换前:" << endl;
	Print_List(L1);
	Print_List(L2);
	L1.swap(L2);
	cout << "交换后:" << endl;
	Print_List(L1);
	Print_List(L2);
}

4.list的大小操作

 5.list的插入和删除操作

 

void Print_List(const list<int> L)
{
	for (list<int>::const_iterator it = L.begin(); it != L.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}
void test01()//list的插入和删除操作
{
	list<int> L1;
	//尾插
	L1.push_back(10);
	L1.push_back(20);
	L1.push_back(30);
	Print_List(L1);
	//头插
	L1.push_front(100);
	L1.push_front(100);
	L1.push_front(100);
	Print_List(L1);
	//头删
	L1.pop_front();
	Print_List(L1);
	//尾删
	L1.pop_back();
	Print_List(L1);
	//insert插入
	list<int>::iterator it = L1.begin();
	L1.insert(++it, 50);//第一个参数是迭代器,先++在插入//注意只能用++不能用+n
	Print_List(L1);
	//删除
	it = L1.begin();
	L1.erase(++it);
	Print_List(L1);
	//移除,删除list中所有为m的元素
	L1.push_back(1000);
	L1.push_back(1000);
	L1.push_back(1000);
	L1.push_back(1000);
	Print_List(L1);
	L1.remove(1000);
	Print_List(L1);
	//清空
	L1.clear();
	Print_List(L1);
}

6.list的数据存取

不能用[]和at()访问,因为数据的内存地址不相连,不支持随机访问

it(迭代器)=it+1报错说明不支持随机访问

it++和it--报错一个说明说明单向链表,都不报错说明是双向链表

 7.list的反转和排序

reserve是预留空间

reverse是反转

 

void Print_List(const list<int> L)
{
	for (list<int>::const_iterator it = L.begin(); it != L.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}
bool myCompare(int a, int b)//比较函数
{
	return a > b;//返回(第一个数大于第二个数相当于降序)反之升序
}
void test01()
{
	list<int> L1;
	//尾插
	L1.push_back(10);
	L1.push_back(20);
	L1.push_back(30);
	Print_List(L1);
	L1.reverse();
	cout << "反转后" << endl;
	Print_List(L1);
	L1.push_front(50);
	L1.push_front(70);
	L1.push_front(60);
	Print_List(L1);
	cout << "排序后:" << endl;
	L1.sort();//不支持随机访问迭代器的容器里,不能用标准算法//但内部会提供一些算法
	//默认排序为升序
	Print_List(L1);
	L1.sort(myCompare);//降序
	cout << "降序后:" << endl;
	Print_List(L1);
}

8.高级排序的案例(对于自定义类型数据,必须自己制定排序规则进行高级排序)

 

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;
};
void Print_List(const list<Person> L)
{
	for (list<Person>::const_iterator it = L.begin(); it != L.end(); it++)
	{
		cout << "姓名:" << it->m_name << " 年龄:" << it->m_age << " 身高:" << it->m_height << endl;
	}
	cout << endl;
}
bool myCompare(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;
	}
	//return (p1.m_age == p2.m_age ? p1.m_height > p2.m_height:p1.m_age < p2.m_age);//三目运算符
}
void test01()
{
	Person p1("刘备", 30, 175);
	Person p2("张飞", 33, 175);
	Person p3("关羽", 30, 185);
	Person p4("赵云", 34, 176);
	Person p5("马超", 37, 178);
	list<Person> L;
	L.push_back(p1);
	L.push_back(p2);
	L.push_back(p3);
	L.push_back(p4);
	L.push_back(p5);
	Print_List(L);
	cout << "-------------------------------" << endl;
	cout << "排序后:" << endl;
	L.sort(myCompare);
	Print_List(L);
}

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

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

相关文章

秋招提前批:抢占求职先机的绝佳机遇(25届提前批名单公布)

秋招&#xff0c;对于即将毕业的大学生来说&#xff0c;是一场至关重要的求职盛宴。每年的秋季&#xff0c;各大企业纷纷抛出橄榄枝&#xff0c;为应届毕业生提供了众多宝贵的就业机会。然而&#xff0c;在求职的漫漫征途中&#xff0c;秋招是一场关键的战役。而秋招提前批&…

二百四十五、海豚调度器——用DolphinScheduler调度执行复杂的HiveSQL(HQL包含多种海豚无法正确识别的符号)

一、目的 在Hive中完成复杂JSON&#xff0c;既有对象还有数组而且数组中包含数组的解析后&#xff0c;原本以为没啥问题了&#xff0c;结果在DolphinScheduler中调度又出现了大问题&#xff0c;搞了一天、试了很多种方法、死了无数脑细胞&#xff0c;才解决了这个问题&#xf…

fastjson1.2.24 反序列化漏洞复现

fastjson简介 Fastjson 是一个 Java 库&#xff0c;可以将 Java 对象转换为 JSON 格式&#xff0c;当然它也可以将 JSON 字符串转换为 Java 对象。 Fastjson 可以操作任何 Java 对象&#xff0c;即使是一些预先存在的没有源码的对象。 这里json与java对象之间的转换&#xff0…

【GaussDB关键技术原理|高可用】DCF双集群容灾

GaussDB关键技术原理&#xff1a;高性能篇&#xff0c;从GaussDB数据库性能优化系统概述、查询处理综述、高性能关键技术等方面为大家进行了解读&#xff0c;并对高斯数据库性能优化做了总结。本篇将分享GaussDB高可用方面的相关知识&#xff0c;详细介绍GaussDB的DCF与双集群容…

双目相机立体匹配算法概述

这里写目录标题 双目相机立体匹配算法概述1.算法分类2.传统算法2.1 局部算法2.2 全局算法2.3 半全局算法 3.深度学习算法3.1 基于CNN的方法3.2 基于GAN的方法3.3 基于transformer的方法 4.总结5.参考文献 双目相机立体匹配算法概述 双目立体匹配是计算机视觉中的一个重要研究方…

数据挖掘与分析部分实验内容

一、机器学习算法的应用 1. 朴素贝叶斯分类器 相关代码 import pandas as pd from sklearn.model_selection import train_test_split from sklearn.naive_bayes import GaussianNB, MultinomialNB from sklearn.metrics import accuracy_score # 将数据加载到DataFrame中&a…

Stable Diffusion 使用详解(3)---- ControlNet

背景 炼丹师在AI绘画的过程中&#xff0c;由于Stable Diffusion的原理是水滴式的扩散作图原理&#xff0c;其实在前面也有提到&#xff0c;他的发挥是‘不稳定’的&#xff0c;因为你没有办法做到精确控制&#xff0c;只能说是大致符合你的预期。你不能总依赖抽卡固定随机数种…

SpringCloud--负载均衡

目录 前言 一.负载均衡的引入 1.1问题引入 1.2代码修改实现 二.负载均衡介绍 2.1实现负载均衡 2.2负载均衡策略 2.3LoadBalancer 原理 学习专栏&#xff1a;http://t.csdnimg.cn/tntwg 前言 在前面的Eureka当中&#xff0c;我们虽然实现了从注册中心中获取url&#xf…

spark 广播变量broadcast

broadcast使用如下图&#xff0c;可以看到创建broadcast是val barr1 sc.broadcast(arr1)&#xff0c;使用broadcast是barr1.value 创建broadcast是使用的broadcastManager。 BroadcastManager cachedValues变量是map结构&#xff0c;key是broadcastId&#xff0c;强引用&a…

初识C++|模板初阶

&#x1f36c; mooridy-CSDN博客 &#x1f9c1;C专栏&#xff08;更新中&#xff01;&#xff09; 目录 &#x1f349;1. 泛型编程 &#x1f349;2. 函数模板 &#x1f95d;2.1 函数模板概念 &#x1f95d;2.2 函数模板格式 &#x1f95d;2.3 函数模板的原理 &#x1f95…

java题目之数字加密以及如何解密

public class Main6 {public static void main(String[] args) {// 某系统的数字密码&#xff08;大于0&#xff09;&#xff0c;比如1983&#xff0c;采用加密方式进行传输//定义了一个静态数组int []arr{1,9,8,3};//1.加密//先给每位数加上5for (int i 0; i <arr.length …

1997. 孤独的素数(结果有一点问题,希望能一起求解)

问题描述 在一个 &#x1d45b; 行 &#x1d45a;列的矩阵王国中&#xff0c;生活着一些整数&#xff0c;其中一些是素数&#xff0c;一些不是素数。如果一个素数的上下左右、左上、右上、左下、右下相邻的数中都没有素数&#xff0c;我们就认为这是一个孤独的素数。 比如&am…

Spring Boot + Spring Cloud 入门

运行配置 java -jar spring-boot-config-0.0.1-SNAPSHOT.jar --spring.profiles.activetest --my1.age32 --debugtrue "D:\Program Files\Redis\redis-server.exe" D:\Program Files\Redis\redis.windows.conf "D:\Program Files\Redis\redis-cli.exe" &q…

【零基础必看的前端教程】——JavaScript(四)类型转换

欢迎大家打开前端的新篇章——JavaScript&#xff0c;JavaScript与HTML、CSS合称为前端三大件&#xff0c;JavaScript是前端的重中之重&#xff0c;小洪将继续以零基础视角&#xff0c;带你循序渐进学习前端知识&#xff0c;一看就懂&#xff0c;小白也能转行做前端&#xff01…

基于WebGoat平台的SQL注入攻击

目录 引言 一、安装好JAVA 二、下载并运行WebGoat 三、注册并登录WebGoat 四、模拟攻击 1. 第九题 2. 第十题 3. 第十一题 4. 第十二题 5. 第十三题 五、思考体会 1. 举例说明SQL 注入攻击发生的原因。 2. 从信息的CIA 三要素&#xff08;机密性、完整性、可用性&…

推荐一款基于Spring Boot 框架开发的分布式文件管理系统,功能齐全,非常便捷(带私活源码)

前言 在数字化时代&#xff0c;文件管理是企业和个人用户的基本需求。然而&#xff0c;现有的文件管理系统往往存在一些痛点&#xff0c;如存储空间有限、文件共享困难、缺乏在线编辑功能、移动端适配性差等。这些问题限制了用户在不同设备和场景下的文件处理能力。 为了解决…

spring-retry详解

spring-retry详解 1.引入依赖2.Retryable基础使用3.Recover使用4.Retryable参数详解5.需要注意 重试机制对于大部分场景来说都是必要的&#xff0c;比如同步调用三方接口&#xff0c;三方接口、信息拉取等网络原因突然不通&#xff0c;有了重试就可以多一些容错机制&#xff0c…

压缩包方式windows安装mysql

压缩包方式windows安装mysql 本文介绍通过压缩包方式在Windows本地安装mysql。 一、 具体步驟 步骤1&#xff0c;下载mysql压缩程序 这里好像上传不了压缩文件&#xff0c;先这样吧&#xff0c;后期补充。 步骤2&#xff0c;解压并手写添加 my.ini 文件 my.ini 文件内容如下…

Air780EP-AT开发-HTTP应用指南

简介 关联文档和使用工具&#xff1a; AT固件获取AT指令手册 概述 4G模块支持HTTP和HTTPS协议&#xff0c; HTTP应用的基本流程如下&#xff1a; 1、激活PDP&#xff08;参考&#xff1a;http://oldask.openluat.com/article/937&#xff09;2、初始化HTTP服务3、设置HTTP会话…

17_高级进程间通信 UNIX域套接字1

非命名的UNIX域套接字 第1个参数domain&#xff0c;表示协议族&#xff0c;只能为AF_LOCAL或者AF_UNIX&#xff1b; 第2个参数type&#xff0c;表示类型&#xff0c;只能为0。 第3个参数protocol&#xff0c;表示协议&#xff0c;可以是SOCK_STREAM或者SOCK_DGRAM。用SOCK_STR…