STL-list类
list的介绍和使用
list的介绍
list的介绍list的介绍
list是双向循环链表
list的使用
构造
list(size_t n,const value_type& val = value_type()) | 构造的list中包含n个值为val的元素 |
list() | 构造空list |
lis(const list& x) | 拷贝构造函数 |
list(inputlerator first,inputlterator last) | 用[first,list)的区间中元素构造list |
int main()
{list<int> A;list<int> B(5,1);list<int> C(B);list<int> D(C.begin(),C.end());return 0;
}
迭代器
begin | 返回第一个元素的迭代器 |
end | 返回最后一个元素的下一个位置的迭代器 |
rbegin | 返回最后一个元素的迭代器 |
rend | 返回第一个元素的上一个位置的迭代器 |
begin与end是一组的正向地迭代器 ++向后移动
rbegin与rend是反向迭代器 ++向前移动
int main()
{int num[10] = { 1,2,3,4,5,6,7,8,9,10 };list<int> a(num,num+10);for (auto it = a.begin(); it != a.end(); it++){cout << *it << ' ';}cout << endl;for (auto rit = a.rbegin(); rit != a.rend(); rit++){cout << *rit << ' ';}cout << endl;for (auto ait : a){cout << ait;}return 0;
}
empty | 检测list是否为空 |
size | 返回list中有效节点数 |
front | 返回list地第一个节点中值的引用 |
back | 返回list最后一个节点中值的引用 |
push_front | 头插 |
pop_front | 头删 |
push_back | 尾插 |
pop_back | 尾删 |
insert | 在pos位置插入 |
erase | 删除pos位置元素 |
swap | 交换元素 |
clear | 清空有效元素 |
int main()
{list<int> a;a.push_back(1);a.push_front(0);for (auto it : a)cout << it;a.pop_front();for (auto it : a)cout << it;a.push_front(3);swap(a.front(),a.back());for (auto it : a)cout << it;swap(a.front(), a.back());for (auto it : a)cout << it;a.clear();cout << a.size();return 0;
}
迭代器失效
只有删除某个节点后,迭代器的位置还指向被删除节点时候才失效
模拟实现
#include<iostream>
using namespace std;namespace mylist
{template<class T>struct ListNode{ListNode(const T& val = T()):_val(val),_pPre(nullptr),_pNext(nullptr){}ListNode<T>* _pPre;ListNode<T>* _pNext;T _val;};template<class T, class Ref, class Ptr>class ListIterator{typedef ListNode<T>* PNode;typedef ListIterator<T, Ref, Ptr> Self;public:PNode node(){return _pNode;}ListIterator(PNode pNode = nullptr):_pNode(pNode){}ListIterator(const Self& l):_pNode(l._pNode){}T& operator*(){return _pNode->_val;}T* operator->(){return _pNode;}Self& operator++(){_pNode = _pNode->_pNext;return *this;}Self operator++(int){Self p = *this;_pNode = _pNode->_pNext;return Self(p);}Self& operator--(){_pNode = _pNode->_pPre;return *this;}Self& operator--(int){Self p = *this;_pNode = _pNode->_pPre;return Self(p);}bool operator!=(const Self& l) const{return _pNode != l._pNode;}bool operator==(const Self& l) const{return _pNode == l._pNode;}private:PNode _pNode;};template<class Iterator, class Ref, class Ptr>struct Reverse_iterator{typedef Reverse_iterator<Iterator, Ref, Ptr> Self;Reverse_iterator(Iterator it):_it(it){}Ref operator*(){Iterator t(_it);return *t;}Ptr operator->(){return &(operator*());}//// 迭代器支持移动Self& operator++(){Self temp(*this);--_it;return temp;}Self operator++(int){Self temp(*this);--_it;return temp;}Self& operator--(){++_it;return *this;}Self operator--(int){Self temp(*this);++_it;return temp;}bool operator!=(const Self& l) const{return _it != l._it;}bool operator==(const Self& l) const{return _it != l._it;}Iterator _it;};template<class T>class list{typedef ListNode<T> Node;typedef Node* PNode;public:typedef ListIterator<T, T&, T*> iterator;typedef ListIterator<T, const T&, const T&> const_iterator;typedef Reverse_iterator<iterator, const T&, const T*> const_Reverse_iterator;typedef Reverse_iterator<iterator,T&,T*> Reverse_iterator;public:list(){CreateHead();}list(int n, const T& value = T()){CreateHead();while(n--)push_front(value);}template <class Iterator>list(Iterator first, Iterator last){CreateHead();while (first != last){push_back(*first);first++;}}list(const list<T>& l){CreateHead();for (auto it : l){push_back(it);}}list<T>& operator=(const list<T>& l){list(l);}~list(){clear();delete _pHead;_pHead = nullptr;}///// List Iteratoriterator begin() { return iterator(_pHead->_pNext); }iterator end() {return iterator(_pHead);};const_iterator begin() const { return const_iterator(_pHead->_pNext); }const_iterator end() const { return const_iterator(_pHead); }Reverse_iterator rbegin(){return Reverse_iterator(--end());}Reverse_iterator rend(){return Reverse_iterator(--begin());}const_Reverse_iterator rbegin()const{return const_Reverse_iterator(--end());}const_Reverse_iterator rend()const{return const_Reverse_iterator(--begin());}///// List Capacitysize_t size()const{size_t s = 0;const_iterator it = this->begin();while (it != this->end()){it++;s++;}return s;}bool empty()const{return _pHead == _pHead->_pNext;}// List AccessT& front() { return _pHead->_pNext->_val; }const T& front()const { return _pHead->_pNext->_val; }T& back() { return _pHead->_pPre->_val; }const T& back()const { return _pHead->_pPre->_val; }// List Modifyvoid push_back(const T& val) { insert(end(), val); }void pop_back() { erase(--end()); }void push_front(const T& val) { insert(begin(), val); }void pop_front() { erase(begin()); }// 在pos位置前插入值为val的节点iterator insert(iterator pos, const T& val){PNode tmp = new Node(val);tmp->_pNext = pos.node();tmp->_pPre = pos.node()->_pPre;pos.node()->_pPre->_pNext = tmp;pos.node()->_pPre = tmp;return iterator(tmp);}// 删除pos位置的节点,返回该节点的下一个位置iterator erase(iterator pos){PNode it = pos.node()->_pNext;PNode p = pos.node();p->_pNext->_pPre = p->_pPre;p->_pPre->_pNext = p->_pNext;delete p;return iterator(it);}void clear(){while (_pHead != _pHead->_pNext){pop_front();}}void swap(list<T>& l){PNode tmp = l._pHead;l._pHead = _pHead;_pHead = tmp;}private:void CreateHead(){_pHead = new Node;_pHead->_pNext = _pHead;_pHead->_pPre = _pHead;}PNode _pHead;};
};
相关文章:

STL-list类
list的介绍和使用 list的介绍 list的介绍list的介绍 list是双向循环链表 list的使用 构造 list(size_t n,const value_type& val value_type())构造的list中包含n个值为val的元素list()构造空listlis(const list& x)拷贝构造函数list(inputlerator first,inputlter…...

Hanlp的学习
参考:HanLP 自然语言处理使用总结-CSDN博客 参考:Sprint Boot 工程中HanLP配置相对路径,始终有问题的解决方案_springboot hanlp-CSDN博客 <!--hanlp 依赖--><dependency><groupId>com.hankcs</groupId><artifa…...

Excel中函数SIGN()的用法
Excel中函数SIGN的用法 1. 函数详细讲解1.1 函数解释1.2 使用格式1.3 参数定义1.4 要点 2. 实用演示示例2.1 函数需求2.2 公式编写 3. 注意事项4. 文档下载5. 其他文章6. 获取全部Excel练习素材快来试试吧🥰 函数练习素材👈点击即可进行下载操作操作注意…...

如何将本地电脑上的文件夹设置为和服务器的共享文件夹
将本地电脑上的文件夹设为与服务器共享的文件夹,通常是在本地开启文件共享,并配置相应的权限,使服务器可以访问该文件夹。以下以 Windows 系统为例说明具体操作步骤: 一、在本地电脑上设置共享文件夹 选择文件夹 找到需要共享的文…...

智能建筑时代的核心选择——基于SAIL-RK3576核心板的AI边缘计算网关方案
随着智能建筑技术的不断发展,建筑设备正日益向“智慧化”迈进。传统的建筑管理系统往往依赖中央服务器和云端平台进行数据处理和控制,但在实时监控、安防及能耗管理等关键环节,延迟和数据安全问题依然存在。此外,物联网设备数量激…...

08、如何预防SQL注入
目录 1、分析及其存在哪些危险 2、预防SQL注入 1、分析及其存在哪些危险 原理: SQL 注入是一种常见的网络攻击手段,攻击者通过在用户输入中插入恶意的 SQL 语句,利用程序对用户输入处理不当的漏洞,使恶意 SQL 语句被数据库服务器执行。 通常发生在应用程序将用户输入直接拼…...

【时时三省】(C语言基础)柔性数组
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 柔性数组 C99中,结构中的最后一个元素允许是未知大小的数组,这就叫做 柔性数组 成员。 例如: 这里把arr就称为柔性数组 有的编译器上是写成int arr&…...

mongodb详解二:基础操作
基础操作 数据库操作collection操作查看表插入数据查找数据 数据库操作 1.创建数据库 use test_db;如果没有数据库,use命令会新建一个;有的话,会切换到这个数据库 2.查看数据库 show dbs;collection操作 查看表 show tables;插入数据 …...

【数据分享】1929-2024年全球站点的逐月平均气温数据(Shp\Excel\免费获取)
气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、湿度等指标,其中又以气温指标最为常用!说到气温数据,最详细的气温数据是具体到气象监测站点的气温数据!本次我们为大家带来的就是具体到气象监…...

管理口令安全和资源(一)
学习目标 Manage passwords using profiles: 使用配置文件(profiles)来管理密码。这意味着你应该能够设置和修改密码策略,比如密码的复杂性、有效期、尝试次数限制等。在Oracle数据库中,配置文件是一组可以应用于所有用户的预定义…...

【Linux】【Vim】vim编辑器的用法
一、vim简介 Vim是一款功能强大且高度可定制的文本编辑器,广泛应用于Linux 和 Unix系统中。 它不仅继承了vi编辑器的所有特性,还增加了许多新的功能,如语法高亮、代码折叠、多级撤销等。 Vim有三种主要的工作模式: 命令模式&am…...

Golang Gin系列-3:Gin Framework的项目结构
在Gin教程的第3篇,我们将讨论如何设置你的项目。这不仅仅是把文件扔得到处都是,而是要对所有东西的位置做出明智的选择。相信我,这些东西很重要。如果你做得对,你的项目会更容易处理。当你以后不再为了找东西或添加新功能而绞尽脑…...

LabVIEW实车四轮轮速信号再现系统
开发了一个基于LabVIEW的实车四轮轮速信号再现系统。该系统解决现有电机驱动传感器成本高、重复性差、真实性差和精度低等问题,提供一种高精度、低成本的轮速信号再现解决方案。 项目背景 ABS轮速传感器在现代汽车安全系统中发挥着至关重要的作用。为保证其准确性和…...

2025.1.16——六、BabySQL 双写绕过|联合注入
题目来源:buuctf [极客大挑战 2019]BabySQL 1 目录 一、打开靶机,分析已知信息 二、手工注入解题 step 1:万能密码 step 2:正常注入,判断字段数 step 3:绕过 step 4:查数据库 step 5&am…...

Spring Boot 下的Swagger 3.0 与 Swagger 2.0 的详细对比
先说结论: Swgger 3.0 与Swagger 2.0 区别很大,Swagger3.0用了最新的注释实现更强大的功能,同时使得代码更优雅。 就个人而言,如果新项目推荐使用Swgger 3.0,对于工具而言新的一定比旧的好;对接于旧项目原…...

【已解决】git clone报错:Failed to connect to github.com port 443: Timed out
1.问题原因1 报错信息1: fatal: unable to access https://github.com/microsoft/xxx/: Failed to connect to github.com port 443: Timed out 报错信息2: fatal: unable to access https://github.com/xxx/xx/: OpenSSL SSL_read: Connection was …...

Qt 程序 DPI 适配方法归纳
方案1:通过 Windows api 处理 缺点:放大之后界面会模糊。 通过调用api实现 #include <ShellScalingAPI.h> #pragma comment(lib, "Shcore.lib")HRESULT hr SetProcessDpiAwareness(PROCESS_SYSTEM_DPI_AWARE);或者使用qt.conf 实现 在…...

AI刷题-小R的随机播放顺序、不同整数的计数问题
目录 一、小R的随机播放顺序 问题描述 测试样例 解题思路: 问题理解 数据结构选择 算法步骤 最终代码: 运行结果: 二、 不同整数的计数问题 问题描述 测试样例 解题思路: 问题理解 数据结构选择 算法步骤 最终…...

windows 极速安装 Linux (Ubuntu)-- 无需虚拟机
1. 安装 WSL 和 Ubuntu 打开命令行,执行 WSL --install -d ubuntu若报错,则先执行 WSL --update2. 重启电脑 因安装了子系统,需重启电脑才生效 3. 配置 Ubuntu 的账号密码 打开 Ubuntu 的命令行 按提示,输入账号,密…...

【影刀_常规任务计划_API调用】
影刀_常规任务计划 1、在常规任务计划被关闭或者设置了定时任务的情况下(非手动执行),通过API的方式启动任务,任务仍然可以被正常执行。 2、如果在常规任务计划里面应用中填写的参数的话, 如果通过api执行ÿ…...

参数校验 Spring Validation框架
后端参数校验 解决:校验前端传入的参数是否符合预期 1、引入依赖 使用Spring Validation框架 <!-- validation参数校验框架--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validatio…...

Spring Boot 基础入门指南
Spring Boot 基础入门指南 引言 在当今快速发展的软件行业中,开发者们一直在寻找简化应用程序开发的方法。Spring Boot 应运而生,它旨在帮助开发者快速构建基于Spring框架的应用程序,同时尽可能减少配置工作。本文将带您了解Spring Boot的基…...

doc、pdf转markdown
国外的一个网站可以: Convert A File Word, PDF, JPG Online 这个网站免费的,算是非常厚道了,但是大文件上传多了之后会扛不住 国内的一个网站也不错: TextIn-AI智能文档处理-图像处理技术-大模型加速器-在线免费体验 https://…...

基于 HTML5 Canvas 制作一个精美的 2048 小游戏--day 1
基于 HTML5 Canvas 制作一个精美的 2048 小游戏 在这个快节奏的生活中,简单而富有挑战性的游戏总能给我们带来乐趣。2048 是一款受欢迎的益智游戏,不仅考验智力,还能让人回味无穷。今天,我带领大家将一起学习如何使用 HTML5 Canv…...

知识图谱入门(一)
最近在研究Graph RAG项目,因此对相关内容做个总结,首先从知识图谱开始,供大家参考。 知识图谱是结构化知识表示的一种形式,它将知识组织成一个多关系图,其中节点表示实体,边表示实体之间的关 系。知识图谱…...

springboot项目-基础数据回显
一.基础数据回显说明 微服务项目中由于从服务独立的角度考虑,对数据库做了分库的处理。对于基础数据表来说,各个服务都是需要的。项目中在使用基础数据时,往往是在sql中写连接然后获取基础数据的名称。例: select wi.name,bc.ci…...

LabVIEW实现油浸式变压器自主监测与实时报告
油浸式变压器广泛应用于电力系统中,尤其是在电力传输和分配领域。为了确保变压器的安全、稳定运行,及时监测其工作状态至关重要。传统的变压器监测方法通常依赖人工巡检和定期检查,但这不能及时发现潜在的故障隐患,且效率较低。随…...

K8S 亲和性与反亲和性 深度好文
今天我们来实验 pod 亲和性。官网描述如下: 假设有如下三个节点的 K8S 集群: k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、镜像准备 1.1、镜像拉取 docker pull tomcat:8.5-jre8-alpine docker pull nginx…...

关于php语言api接口开发的流程
确定接口需求:首先明确接口的功能和需求,包括输入参数、输出结果以及接口的业务逻辑。 设计接口路由:根据接口需求,设计具体的接口路由,即URL路径,用于访问接口。 搭建PHP环境:确保你的服务器上…...

医疗集群系统中基于超融合数据库架构的应用与前景探析
一、引言 1.1 研究背景与意义 随着医疗信息化的飞速发展,医疗数据呈爆炸式增长。从日常诊疗记录、患者病历,到各类医疗影像、检查检验数据等,海量信息不断涌现。据统计,医疗数据的年增长率高达 30% 以上 ,2025 年,全球医疗数据量将达到 2314 艾字节(EB)。如此庞大的数…...