C++——STL标准模板库——容器详解——list

news2024/11/17 19:50:16

一、基本概念

(一)定义

list:双向链表。list是一种分布式存储的线性表,每个节点分为数据域和指针域,其中指针域中包含一个指向前驱节点的指针和一个指向后续节点的指针,基本模型如下:

(二)特性

1、双向链表:每个元素都有一个前驱和一个后继,这种结构允许在链表的任何位置实现快速的插入和删除而不影响其他元素。插入和删除时间复杂度为O(1)。

2、迭代器:list提供了双向迭代器,支持++和--运算符,能够前后移动,但不支持随机访问,也就是不支持+、-、+=、-=运算。

3、优势和劣势:相对于deque或者vector,在任意位置插入或者删除元素效率较高;但随机访问效率较低。使用场景多为需要频繁插入或者删除元素时。

二、构造函数

(1)list<T>::list();                        默认构造函数

(2)list<T>::list(size_t size);       构造包含size个元素的链表,默认值为0;

(3)list<T>::list(size_t size,T value);        申请size大小链表,初始化为value;

(4)list<T>::list(initializer_list<int> _list);   初始化列表构造;

(5)list<T>::list(list<int>& other);               拷贝构造函数; 

(6)list<T::list(iterator begin,iterator end); 指定范围构造;

(7)list<T>::list(list<int>&& other);             移动构造;(c++11)

三、成员函数

(一)迭代器相关函数

begin()和end();                返回指向首节点迭代器和指向尾节点后面一个位置迭代器;

cbegin()和cend();             begin()和end()的常量迭代器

rbegin()和rend();              begin()和end()的反向迭代器

crbegin()和crend();           begin()和end()的反向常量迭代器

(二)大小相关函数

size_t list<T>::size();                        返回链表当前元素数量

size_t list<T>::max_size();               返回链表最大容纳元素数量

bool   list<T>::empty();                       判断链表是否为空

(三)访问函数

const T& list<T>::front();                                返回第一个元素常量引用;

const T& list<T>::back();                               返回最后一个元素常量引用;

(四)修改函数

void list<T>::push_back(T&value);                尾插

void list<T>::push_front(T&value);                头插

void list<T>::pop_back();                               尾删

void list<T>::pop_front();                               头删

void list<T>::remove(T&value);                     删除指定元素

void list<T>::unique();                                   删除相邻且重复的后续元素

void list<T>::insert(iterator pos,T&value);     指定位置插入元素,存在插入多个元素、插入区间、插入初始化列表等多个重载

void list<T>::splice(iterator pos,list<T>&other); 指定位置复制插入或者移动插入other链表(指定元素或指定区间的元素)

void list<T>::erase(iterator pos);                   删除迭代器指定位置的元素,或者区间

(五)查找函数

list<T>::itrator find(list<T>::iterator first,list<T>::iterator last,const T& value);                                    查找容器指定区间内的value值第一次出现的位置

int count(list<T>::iterator first,list<T>::iterator last,const T&value);                                                 查找容器指定区间内value的个数

注意:find()函数和count()函数不是容器的成员函数

(六)其他函数

list<T>::swap(list<T>&other);     交换两个链表的内容

list<T>::revers();                         翻转链表

list<T>::sort();                             排序函数,默认递增;当链表内元素是自定义类型或者需要递减排序时,需要传入比较函数作为参数。

list<T>::clear();                           清空链表

list<T>::resize(size_t newsize);  改变链表大小,大于原链表大小时,添加初始化元素;小于原链表大小时,从链表后面删除相应元素。

四、排序算法示例

#include<iostream>
using namespace std;
#include<list>
#include<algorithm>
#include<string>
class Person {
public:
	string m_Nmae;
	int m_Age;
	int m_Height;
};
void printPerson(const Person&p) {
	cout << "姓名:" << p.m_Nmae << " 年龄:" << p.m_Age << " 身高:" << p.m_Height << 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;
	}
}
void test() {
	Person p1 = { "张三",20,170 };
	Person p2 = { "李四",30,165 };
	Person p3 = { "王五",40,185 };
	Person p4 = { "赵六",40,180 };
	Person p5 = { "陈七",50,185 };
	list<Person>l;
	l.push_back(p1);
	l.push_back(p3);
	l.push_back(p4);
	l.push_back(p2);
	l.push_front(p5);
	for_each(l.begin(), l.end(), printPerson); cout << endl;
	l.sort(MyCompare);
	for_each(l.begin(), l.end(), printPerson);
}
int main(int argc,char const **argv) {
	test();
	return 0;
}

 例子中对排序多加了一层逻辑,优先年龄排序,年龄相同时根据身高排序。

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

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

相关文章

【Docker】数据管理

&#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Docker的相关操作吧 目录 &#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 前言 一.数据卷 示例演示 示例剖析…

three.js 学习笔记(学习中1.10更新) |

文章目录 three.js 学习笔记基础概念透视相机 第一个three.js应用threejs画布尺寸和布局canvas画布宽高度动态变化 坐标辅助器 THREE.AxesHelper实现动画效果requestAnimationFrame时间相关属性和方法 THREE.Clock类 相机控件 轨道控制器OrbitControls 灯光点光源点光源辅助观察…

CentOS查看修改时间

经常玩docker的朋友应该都知道&#xff0c;有很多的镜像运行起来后&#xff0c;发现容器里的系统时间不对&#xff0c;一般是晚被北京时间8个小时&#xff08;不一定&#xff09;。 这里合理怀疑是镜像给的初始时区是世界标准时间&#xff08;也叫协调世界时间&#xff09;。 有…

美团2024届秋招笔试第一场编程真题(js版本)

1.小美的外卖订单 简单的加法逻辑&#xff0c;需要注意的是各个数据的边界问题 折扣价不能超过原价减的价格不能超过满的价格满减优惠仅限原价购入 const rl require("readline").createInterface({ input: process.stdin }); void (async function () {let count…

NVIDIA深入理解之pynvml库

一、前言 写在前面 该文章是对我之前文章《Fedora上安装NVIDIA闭源显卡驱动》的一个拓展&#xff0c;正好寒假闲的没事干不如加深一下对NVIDIA的了解。Python是当前非常流行的一门编程语言&#xff0c;它以kiss为设计思想&#xff0c;能封装就能封装&#xff0c;给用户提供比…

Java封装了一个自适应的单位转换工具类

目录 前言 1、前期准备 2、实现代码 2.1 方法一&#xff1a;通过map去标记需要转换的 类属性字段 2.2 方法二&#xff1a;配合自定义注解 前言 平时在做项目中&#xff0c;经常会做一些数据书籍&#xff0c;尤其像是数据看板之类&#xff0c;需要从数据库中查询想要的数据…

这是一家有图书馆的公司

Tubi 技术团队的同事们&#xff0c;除了爱写书、翻译书&#xff0c;也很爱读书。应广大爱书人号召&#xff0c;Tubi 中国团队从 2018 年 7 月开始兴建 Tubi 小书架&#xff0c;迄今已建成了一个有着17 种类别、近 500 本藏书、100 位常驻借阅成员、以音视频开发、广告推荐和团队…

固态继电器SSR光耦OR-806A ,对标替代AQW212

固态继电器 VL60V输出端击穿电压光耦 高隔离电压 60 至 600V 输出耐受电压 工业温度范围&#xff1a;-40 to 85℃ 高灵敏度和高速响应 特征 输入和输出之间的高隔离电压 &#xff08;Viso&#xff1a;5000 V rms&#xff09;。 控制低电平模拟信号 高灵敏度和高速响应 …

Neo4j备份

这里主要讲Neo4j在windows环境下如何备份&#xff0c;Linux环境同理 Neo4j恢复看这里:Neo4j恢复-CSDN博客 Step1:停服 关闭neo4j.bat console会话窗口即可 Step2: 备份 找到数据目录&#xff0c;并备份、压缩 copy即可 data - 20240108.7z Step3: 启动服务 进入命令行&am…

【动态规划】20子数组系列_环形子数组的最大和_C++(medium)

题目链接&#xff1a;leetcode环形子数组的最大和 目录 题目解析&#xff1a; 算法原理 1.状态表示 2.状态转移方程 3.初始化 4.填表顺序 5.返回值 编写代码 题目解析&#xff1a; 题目让我们求返回 nums 的非空 子数组 的最大可能和 这道题如果是按照-这道题-是不对…

MySQL数据被误删怎么办?

文章目录 前言数据备份恢复工具数据备份策略数据备份恢复演示备份数据模拟数据误删恢复备份的数据恢复未备份的数据 总结 前言 很多年前&#xff0c;被公司外派到一家单位驻场开发一个OA项目&#xff0c;两个开发对接各部门的需求&#xff0c;需求还要及时生效&#xff08;一边…

usb转i2c无需代码实现

总体思路 usb 转 ttl ttl转i2c 因此可以使用普通的串口调试助手进行。 同时也避免了自己写程序的麻烦。 关键芯片 参考资料 SC18IM700_4_20191009.fm (szlcsc.com)https://atta.szlcsc.com/upload/public/pdf/source/20221014/7E6E1261944FE14AC40A431139B6E16B.pdf …

C++(9)——内存管理

1. 内存分类&#xff1a; 在前面的文章中&#xff0c;通常会涉及到几个名词&#xff0c;例如&#xff1a;栈、堆。这两个词所代表的便是计算机内存的一部分 。在计算机中&#xff0c;对系统的内存按照不同的使用需求进行了区分&#xff0c;大致可以分为&#xff1a;栈 、堆、数…

平均预期寿命可视化

完整地址&#xff1a; 一键三连感谢您的观看 https://www.bilibili.com/video/BV11V41197Rd/?spm_id_from333.999.list.card_archive.click&vd_sourcee9167c654bb4523338a765358a8ac2af<!DOCTYPE html> <html><head><meta charset"utf-8"…

工程师职称申报业绩是如何要求的?

无论是初级职称还是中级职称或是高级职称&#xff0c;评审的重要条件之一就是相关的业绩证明。 一、个人业绩&#xff0c;比如你做过哪些与本专业相关的业绩证明&#xff0c;像工程类的职称&#xff0c;你的业绩证明就包括中标通知书、竣工验收报告&#xff0c;或是你参与工程建…

脑科学与人工神经网络ANN的发展历程与最新研究

本文深入研究了ANN的基本概念、发展背景、应用场景以及与人脑神经网络的关系。 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&#xff0c;同济本复旦硕&#xff0c;复旦机器人智能实验室成员&#xff0c;阿里云认证的…

【书生·浦语大模型实战营04】《(4)XTuner 大模型单卡低成本微调实战》学习笔记

《(4)XTuner 大模型单卡低成本微调实战》 课程文档&#xff1a;《XTuner 大模型单卡低成本微调实战》 1 Finetune简介 LLM的下游应用中&#xff0c;增量预训练和指令跟随是经常会用到两种的微调模式 1.1 增量预训练微调 使用场景&#xff1a;让基座模型学习到一些新知识&a…

中本聪15年前剧本重演!“比特币上市首日”成绩斐然,ETF交易量冲破46亿美元!

2024年1月11日&#xff0c;美国证券交易委员会&#xff08;SEC&#xff09;以3-2投票结果批准比特币现货ETF。 2009年1月11日&#xff0c;中本聪向比特币早期开发者哈尔芬尼(Hal Finney)转出10枚比特币&#xff0c;使他成为世界上第一个透过交易获得比特币的人。随后&#xff0…

13个自媒体文库平台(附通道链接)

​划到最后“阅读原文” ——进入官网 Hi&#xff0c;大家好&#xff0c;我是胡猛夫&#xff0c;每天分享实用运营工具&#xff01; 更多内容&#xff0c;更多资源&#xff0c;欢迎交流&#xff01; 公 号 | 微视角文化 》》精彩推荐 >>微视角文化知识库&#xff1a;移…

智汇云舟受邀出席石油化工工程数字化交付研讨会

1月9日&#xff0c;由中国石油和石化工程研究会主办的石油化工工程数字化交付研讨会暨智能化工厂建设运行经验交流会在北京顺利召开。智汇云舟创始人兼总裁周舟受邀出席活动&#xff0c;与来自中国石油、中国石化、中国海油、中国中化等单位的相关专家、领导三百余人共同探讨如…