【C++中STL】list链表

List链表

  • 基本概念
  • 构造函数
  • 赋值和交换
  • 大小操作
  • 插入和删除
  • 数据存取
  • 反转和排序

基本概念

将数据进行链式存储
链表list是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的,链表是由一系列结点组成,结点的组成一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域STL中的链表是一个双向循环链表。更深层次的理解可以看看数据结构中的链表。
优点:可以对任意的位置进行快速插入或删除元素。
缺点:容器遍历速度,没有数组快,占用的空间比数组大。
数组的优缺点和链表相反。
在这里插入图片描述
在这里插入图片描述
在链表中在任意位置插入和删除元素不会造成原有list迭代器的失效,这个在vector中不成立。
总结:STL中list和vector是两个最常被使用的容器,各有优缺点。

构造函数

1、list lst;默认构造函数形式,采用模板类实现
2、list(beg,end);构造函数将[beg,end]区间中的元素拷贝给本身
3、list(n,elem);构造函数将n个elem拷贝给本身
4、list(const list &lst);拷贝构造函数

void test1() {
	list<int> l;
	l.push_back(123);
	l.push_back(50);
	l.push_back(34);
	l.push_back(111);
	p(l);
	list<int>l2(l.begin(), l.end());
	p(l2);
	list<int>l3(5, 50);
	p(l3);
	list<int>l4(l3);
	p(l4);
}

赋值和交换

1、assign(beg,end);将[beg,end]区间中的元素拷贝给本身
2、assign(n,elem);将n个elem赋值给本身
3、list& operator=(const list &lst);重载等号操作符
4、swap(lst);将lst和本身的元素互换

void test1() {
	...
	list<int>l2;
	l2.assign(l.begin(), l.end());
	list<int>l3;
	l3.assign(5, 50);
	list<int>l4;
	l4 = l3;
	l3.swap(l2);
...
}

大小操作

1、empty();判断容器是否为空
2、size();返回容器中元素的个数
3、resize(num);重新指定容器的长度为num,若容器变长,则以默认值0填充新位置;若容器变短,则末尾超出容器长度的元素被删除
4、resize(num,elem);重新指定容器的长度为num,若容器变长,则以elem值填充新位置;若容器变短,则末尾超出容器长度的元素被删除

if (!l.empty()) {
		cout << "大小" << l.size()<<endl;
	}
	l.resize(6,10);
	cout << "大小" << l.size() << endl;

插入和删除

1、push_back(ele);尾部插入元素ele
2、push_front();在头部插入一个数据
4、pop_back();删除最后一个元素
5、pop_front();删除第一个元素
6、insert(pos,ele);迭代器指向位置pos插入元素ele的拷贝,返回新数据的位置
7、insert( pos,n,ele);迭代器指向位置pos插入n个元素ele,无返回值
8、insert(pos,beg,end);在pos位置插入[beg,end)区间的数据,无返回值
9、erase(pos);删除pos位置的元素,返回下一个数据的位置
10、erase(beg,end);删除迭代器从start到end之间的元素,返回下一个数据的位置
11、clear();删除容器中的所有元素
12、remove(elem);删除容器中所有与elem值相匹配的元素

void test1() {
	list<int> l;
	l.push_back(123);
	l.push_back(50);
	p(l);
	l.erase(l.begin(), l.end());
	l.push_front(34);
	l.push_front(111);
	p(l);
	l.pop_back();
	l.pop_front();
	p(l);
	l.insert(l.begin(), 99);
	l.insert(l.begin()++, 3, 999);
	l.insert(l.end(), l.begin(), l.end());
	p(l);
	l.erase(l.begin());
	p(l);
	l.remove(999);
	p(l);
	l.clear();
	p(l);
}

数据存取

不可以使用[]和at访问,因为list链表不是连续性空间存储数据,迭代器不支持随机访问。
1、front();返回第一个元素
2、back();返回最后一个元素

void test1() {
	...
	cout << "第一个元素" << l.front() << endl;
	cout << "最后一个元素" << l.back() << endl;
}

反转和排序

1、reverse();反转
2、sort();排序

void test1() {
	list<int> l;
	l.push_back(123);
	l.push_back(50);
	l.push_front(34);
	l.push_front(111);
	//所有不支持随机访问迭代器的容器,不可以用标准算法
	//不支持随机访问迭代器的容器会内部会提供对应的一些算法
	sort(l.begin(), l.end());//运行时会报错
	//不属于全局函数,相当于成员函数,默认从小到大
	l.sort();
	p(l);
	l.sort(myCompare);
	p(l);
	l.reverse();
	p(l);
}

自定义类排序

class S {
public:
	int age;
	string name;
	int h;
	S(string _n, int _a,int _h) {
		name = _n;
		age = _a;
		h = _h;
	}
};
//降序排序
bool CompareS(S v1,S v2) {
	if (v1.age == v2.age) {
		return v1.h > v2.h;
	}
	return v1.age < v2.age;
}
void test1() {
	list<S> l;
	S s1("Tom", 18, 187);
	S s2("Lisa", 20, 165);
	S s3("LuJy", 34, 190);
	S s4("Tony", 21, 167);
	S s5("Ala", 20, 168);
	l.push_back(s1);
	l.push_back(s2);
	l.push_back(s3);
	l.push_back(s4);
	l.push_back(s5);
	for (list<S>::iterator it = l.begin();it != l.end();it++) {

		cout << "姓名:" << (*it).name << "\t年龄:" << (*it).age << "\t身高:" << (*it).h << endl;
	}
	cout << "-----------------------------------------" << endl;
	l.sort(CompareS);
	for (list<S>::iterator it = l.begin();it != l.end();it++) {

		cout << "姓名:" << (*it).name << "\t年龄:" << (*it).age << "\t身高:" << (*it).h << endl;
	}
}

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

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

相关文章

linux基础学习(7):find命令

1.按照文件名搜索 find 搜索路径 选项 文件名 选项&#xff1a; -name&#xff1a;按文件名搜索 -ineme&#xff1a;不区分文件名大小写搜索 -inum&#xff1a;按inode号搜索 按文件名搜索跟按关键词搜索不一样&#xff0c;只能搜到文件名完整对应的文件 *根据文件名…

Vulnhub靶机:FunBox11

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.15&#xff09; 靶机&#xff1a;FunBox11&#xff08;10.0.2.36&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://www.vulnhub.com/entry/funb…

Java编程的利器:Pair和Triple无缝解决多值返回问题,助力编写高效代码

在实际编码中&#xff0c;经常会遇到一个方法需要返回多个值的情况&#xff0c;你编写一个方法&#xff0c;需要同时返回某个操作的结果和一些相关的附加信息。使用传统的方式&#xff0c;你可能需要创建一个包含这些信息的自定义类或者使用集合&#xff08;如 Map&#xff09;…

下拉回显问题案例大全

下拉回显问题案例大全 一、原生js案例 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>下拉框数据回…

Ubuntu18编译jdk8源码

环境 系统 ubuntu18 Linux ubuntu 5.4.0-150-generic #167~18.04.1-Ubuntu SMP Wed May 24 00:51:42 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux jdk源码openjdk-8u41-src-b04-14_jan_2020.zip bootJdk jdk-8u391-linux-x64.tar.gz ps -e|grep ssh sudo apt-get install ssh…

GitBook可以搭建知识库吗?有无其他更好更方便的?

在一个现代化的企业中&#xff0c;知识是一项宝贵的资产。拥有一个完善的企业知识库&#xff0c;不仅可以加速员工的学习和成长&#xff0c;还能提高工作效率和团队协作能力。然而&#xff0c;随着企业不断发展和扩大规模&#xff0c;知识库的构建和管理变得更加复杂和耗时。 |…

steam搬砖项目真的假的?怎么赚钱?到底能不能做

steam搬砖是真的还是假的&#xff1f;不管能不能做到&#xff0c;你一定因为这个问题找到了我&#xff0c;看了这篇文章。我已经练习蒸砖项目3年多了。我可以负责任地说&#xff0c;相比其他互联网项目&#xff0c;蒸汽砖项目绝对是门槛最低、最稳定、期限最长、变现最快的一个…

2982. 找出出现至少三次的最长特殊子字符串 II

字典树思路 用字典树搞一下就好了&#xff0c;比如aaaaa &#xff1a; a存5次 aa 4次以此类推&#xff5e; 字典树板子复习&#xff1a;P8306 【模板】字典树 这里这个清空方式 很好 因为很多时候memset T #include<iostream> #include<cstring> using namesp…

如何训练和导出模型

介绍如何通过DI-engine使用DQN算法训练强化学习模型 一、什么是DQN算法 DQN算法&#xff0c;全称为Deep Q-Network算法&#xff0c;是一种结合了Q学习&#xff08;一种价值基础的强化学习算法&#xff09;和深度学习的算法。该算法是由DeepMind团队在2013年提出的&#xff0c;…

STM32标准库——(4)OLED显示屏

1.STM32调试方式 串口调试&#xff1a;通过串口通信&#xff0c;将调试信息发送到电脑端&#xff0c;电脑使用串口助手显示调试信息显示屏调试&#xff1a;直接将显示屏连接到单片机&#xff0c;将调试信息打印在显示屏上Keil调试模式&#xff1a;借助Keil软件的调试模式&…

语义分割(2) :自定义Dataset和Dataloader

文章目录 1. 数据处理1.1 标签转换(json2mask和json2yolo)1.1.1 json2mask1.1.2 json2yolo 1.2 划分数据集1.2 不规范的标签图片处理1.3 批量修改图片后缀 2 自定义Dataset 和 Dataloader2.1 自定义Dataset2.1.1 数据增强(1) 对图像进行缩放并且进行长和宽的扭曲(2) 随机翻转图…

预处理详解1❤

一&#xff1a;预定义符号 C语言中设置了一些预定义符号&#xff0c;它们可以直接使用&#xff0c;同时预定义符号是在预处理期间处理的。 以下就是相关的预处理符号的作用。 二&#xff1a;#define定义常量 首先基本的语法是 #define name stuff 相对比较简单&#xff…

Dijkstra求最短路 I——朴素版Dijkstra算法

问题描述 稠密图使用朴素版Dijkstra算法 使用邻接矩阵存储图定义dist[]数组用来表示图中所有点到1号点的距离&#xff0c;初始化所有点到1号点的距离为0x3f3f3f3f&#xff0c;dist[1] 0循环n次 在图中找出距离1号点最小的点&#xff0c;并且当前点没有被确定过&#xff0c;另…

服务器无法访问外网怎么办

目前是互联网时代&#xff0c;网络已经成为人们日常生活中不可或缺的一部分。我们通过网络获取信息、进行沟通、甚至进行工作&#xff0c;因此&#xff0c;保持网络的稳定和通畅是非常重要的。然而&#xff0c;有时候我们可能会遇到一些网络无法访问外网的问题&#xff0c;这给…

Odoo14 中的小部件列表

们有不同类型的小部件用于不同的目的&#xff0c;帮助我们简化操作。小部件用于使代码变得简单且用户友好&#xff0c;这将有助于软件的编码和编程方面。在 Odoo 14 开发中&#xff0c;我们可以利用不同的小部件&#xff0c;这些小部件可用于编程操作的某些特定方面。这些简化工…

黑豹程序员-vue实现两级联动下拉列表

需求 在开发中这类需求很多&#xff0c;前后两个下拉框有紧密关系&#xff0c;第一个下拉框相当于一个分类&#xff0c;选中第一个下拉框中的某个分类后&#xff0c;第二个下拉框的内容随之改变&#xff0c;列出其分类下的选项。 图例 选中某个一级风险领域后&#xff0c;二级…

38、Flink 的CDC 格式:canal部署以及示例

Flink 系列文章 一、Flink 专栏 Flink 专栏系统介绍某一知识点&#xff0c;并辅以具体的示例进行说明。 1、Flink 部署系列 本部分介绍Flink的部署、配置相关基础内容。 2、Flink基础系列 本部分介绍Flink 的基础部分&#xff0c;比如术语、架构、编程模型、编程指南、基本的…

蓝牙----蓝牙协议栈Host层

蓝牙协议栈----Host层 蓝牙物理层基本信息链路层的状态机进入连接态的步骤主动扫描与被动扫描链路层通信模式 蓝牙地址蓝牙设备地址蓝牙标识地址蓝牙接入地址 蓝牙广播信道管理蓝牙数据信道跳频 蓝牙协议栈Host层包括PHY、LL、HCL层&#xff0c;注重关注PHY物理层和LL链路层。 …

【RT-DETR有效改进】轻量化ConvNeXtV2全卷积掩码自编码器网络

前言 大家好&#xff0c;我是Snu77&#xff0c;这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进&#xff0c;内容持续更新&#xff0c;每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本&#xff0c;同时修改内容也支持Re…

Leetcode:二分搜索树层次遍历

题目&#xff1a; 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例&#xff1a; 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,…