C++STL--------list
文章目录
- 一、list链表的使用
- 1、迭代器
- 2、头插、头删
- 3、insert任意位置插入
- 4、erase任意位置删除
- 5、push_back 和 pop_back()
- 6、emplace_back尾插
- 7、swap交换链表
- 8、reverse逆置
- 9、merge归并
- 10、unique去重
- 11、remove删除指定的值
- 12、splice把一个链表的结点转移个另一个链表
- 13、sore排序
- 二、operator->
- 三、list常用接口模拟实现
截图内容来源
一、list链表的使用

是一个支持O(1)时间复杂度插入和删除的链表结构,迭代器是双向的,底层是一个带头双向循环链表。
1、迭代器

双向迭代器:++ 、–
2、头插、头删
头插:

头删:

3、insert任意位置插入

更具迭代器来完成位置的确定
4、erase任意位置删除

位置用迭代器表示,也可以删除一个迭代器区间
5、push_back 和 pop_back()
头插:

头删:

6、emplace_back尾插

跟push_back有差异,push_back要插入的类型被固定,可以支持隐式类型转换。
emplace_back不支持隐式类型转换,但可以直接传要初始的值进行构造。
class pos
{
private:int _row;int _col;
public:pos(int row = 0, int col = 0):_row(row),_col(col){}};int main()
{list<pos> lt;pos p1(1, 2);lt.push_back(p1);lt.push_back(pos(2, 3));lt.push_back({ 2,3 });//隐式类型转换lt.emplace_back(p1);lt.emplace_back(pos(2,3));lt.emplace_back(2, 3);//可变模版参数return 0;
}
7、swap交换链表

比算法库里的swap更高效,底层是交换指向头结点。
8、reverse逆置

插入1到9,打印9到1
9、merge归并

合并完后链表x为空
10、unique去重

排成有序的再去重
11、remove删除指定的值

remove_if满足条件再删
12、splice把一个链表的结点转移个另一个链表

可以调整链表里面的顺序,把自己的结点转移给自己
13、sore排序

默认排序是升序
如果想降序要使用仿函数

让他大于就交换
int main()
{list<int> ls({ 1,-2,0,3,8,7 });for (auto c : ls){cout << c << ' ';}cout << endl;ls.sort();//升序ls.sort(greater<int>());//降序for (auto c : ls){cout << c << ' ';}return 0;
}
list 自己实现的sort是支持双向迭代器的,算法库里的sort是传随机迭代器
二、operator->
class pos
{
private:public:pos(int row = 0, int col = 0):_row(row),_col(col){}int _row;int _col;
};int main()
{list<pos> lt;pos p1(1, 2);lt.push_back(p1);list<pos>::iterator i = lt.begin();cout << i->_row;//这样写省略了一个->//相应于调用 i.operator->()->_row;return 0;
}
三、list常用接口模拟实现
#pragma once
#include <iostream>
#include <assert.h>
namespace lsh
{//List节点类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 Iterator,class Ref,class Ptr>struct Reverse_iterator{Iterator _it;typedef Reverse_iterator Self;Reverse_iterator(Iterator it):_it(it){}Ref operator*(){return *_it;}Ptr operator->(){return _it.operator->();}Reverse_iterator& operator++(){--_it;return *this;}Reverse_iterator& operator--(){++_it;return *this;}Reverse_iterator operator++(int){Reverse_iterator tmp = *this;--_it;return tmp;}Reverse_iterator operator--(int){Reverse_iterator tmp = *this;++_it;return tmp;}bool operator!=(const Self& l){return _it != l._it;}};//List的迭代器类template<class T, class Ref, class Ptr>class ListIterator{typedef ListNode<T>* PNode;typedef ListIterator<T, Ref, Ptr> Self;public:ListIterator(PNode pNode = nullptr):_pNode(pNode){}ListIterator(const Self& l):_pNode(l._pNode){}Ref operator*(){return _pNode->_val;}Ptr operator->(){return &_pNode->_val;}Self& operator++(){_pNode = _pNode->_pNext;return *this;}Self& operator--(){_pNode = _pNode->_pPre;return *this;}Self operator++(int){Self tmp = *this;_pNode = _pNode->_pNext;return tmp;}Self operator--(int){Self tmp = *this;_pNode = _pNode->_pPre;return tmp;}bool operator!=(const Self& l){return _pNode != l._pNode;}bool operator==(const Self& l){return !(*this != l);}PNode Get(){return _pNode;}private:PNode _pNode;};//list类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, T&, T* > reverse_iterator;typedef Reverse_iterator<const_iterator, const T&, const T*> const_reverse_iterator;public://List的构造list(){CreateHead();}list(int n, const T& value = T()){CreateHead();for (int i = 0; i < n; i++){push_back(value);}_size = n;}template<class Iterator>list(Iterator first, Iterator last){CreateHead();while (first != last){push_back(*first);first++;}}list(const list<T>& l){CreateHead();for (auto c : l){push_back(c);}}list<T>& operator=(list<T> l){swap(l);return *this;}~list(){clear();delete _pHead;}/////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)_pHead->_pPre;}reverse_iterator rend(){return (reverse_iterator)_pHead;}const_reverse_iterator rbegin() const{return (const_reverse_iterator)_pHead->_pPre;}const_reverse_iterator rend()const{return (const_reverse_iterator)_pHead;}////List Capacitysize_t size()const{return _size;}bool empty()const{return _size == 0;}///List AccessT& front(){return *(begin());}const T& front()const{return *(begin());}T& back(){return *(--end());}const T& back()const{return *(--end());}/////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 = pos.Get();PNode newnode = new Node(val);newnode->_pNext = tmp;newnode->_pPre = tmp->_pPre;tmp->_pPre->_pNext = newnode;tmp->_pPre = newnode;_size++;return newnode;}//删除pos位置的节点iterator erase(iterator pos){assert(pos != _pHead);PNode del = pos.Get();PNode next = del->_pNext;PNode pre = del->_pPre;pre->_pNext = next;next->_pPre = pre;delete del;_size--;return (iterator)next;}void clear(){while (_size){pop_back();}}void swap(list<T>& l){std::swap(_pHead, l._pHead);}private:void CreateHead(){_pHead = new Node();_size = 0;_pHead->_pPre = _pHead;_pHead->_pNext = _pHead;}PNode _pHead;size_t _size;};}
相关文章:
C++STL--------list
文章目录 一、list链表的使用1、迭代器2、头插、头删3、insert任意位置插入4、erase任意位置删除5、push_back 和 pop_back()6、emplace_back尾插7、swap交换链表8、reverse逆置9、merge归并10、unique去重11、remove删除指定的值12、splice把一个链表的结点转移个另一个链表13…...
M1 Mac打开Jupyter notebook
当我成功安装了Jupyter之后,发现无法通过 jupyter notebook 开始工作。 最初的问题是 zsh command not found 该问题是个路径问题,通过添加PATH环境变量就行了,设置环境变量时需要注意,zshrc和bash_profile中都可以设置&…...
docker 仓库之harbor详解
Harbor 是一个开源的企业级容器镜像仓库,由 VMware 提供。它基于 Docker 分布式应用程序框架构建,旨在解决企业对容器镜像存储、安全性和可管理性的需求。Harbor 提供了丰富的功能,包括用户权限管理、镜像复制、审计日志、漏洞扫描等…...
【环境变量】windons的Path
在 Windows 操作系统中,“Path” 是一个重要的环境变量,它定义了操作系统在执行命令时搜索可执行文件的目录。简而言之,当你在命令行(例如 cmd 或 PowerShell)中输入一个命令时,Windows 会查看 “Path” 环…...
go语言里的切片
package mainimport "fmt"func main() {// 创建一个长度为3,容量为5的整数切片var numbers make([]int, 3, 8)// 打印初始状态printSlice(numbers) // 输出: len3 cap5 slice[0 0 0]// 向切片添加元素numbers append(numbers, 1, 2)// 再次打印…...
革新你的智能体验:AIStarter 3.1.1正式版现已上线【安全认证】ai应用市场,数字人,ai绘画,ai视频,大模型,工作流因有尽有
在这个日新月异的技术时代里,人工智能(AI)正以前所未有的速度改变着我们的生活与工作方式。作为行业内的先锋之一,我们非常高兴地宣布:经过团队不懈努力以及严格的测试与优化后,AIStarter 3.1.1新版现已震撼…...
【练习17】数组中的最长连续子序列
数组中的最长连续子序列_牛客题霸_牛客网 (nowcoder.com) 题目分析:排序双指针 排序后,判断是否连续:后一个数-前一个数1 排序后,判断是否重复:后一个数-前一个数0 public class Solution {public int MLS (int[] arr)…...
2024 最适合 Web 开发者的 9 款 Chrome 扩展
随着 2024 年的进展,Chrome 扩展程序已成为 Web 开发人员工具包中不可或缺的一部分,在浏览器中提供强大的功能。在这篇文章中,我们将探讨今年在 Web 开发社区掀起波澜的 9 大 Chrome 扩展程序。 1.Lighthouse https://chromewebstore.google…...
React综合指南(二)
https://activity.csdn.net/creatActivity?id10787 #1024程序员节|征文# 21、 React中的状态是什么?它是如何使用的?? 状态是 React 组件的核心,是数据的来源,必须尽可能简单。基本上状态是确定组件呈现…...
XML\XXE漏洞基本原理
前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文整理XXE漏洞的相应信息 XML与XXE漏洞 这个东西有许多叫法,XML漏洞与XXE漏洞差不多都是一个东西。 这个漏洞是出现在XMl上的,然后可以叫他XXE注入漏洞。 XML简介 XML是一种数据的传输…...
uniapp小程序自定义聚合点
注: 1.默认的聚合点可以点击自动展示子级点位,但是自定义的聚合点在ios上无法触发markerClusterClick的监听,至今未解决,不知啥原因 2.ios和安卓展示的点位样式还有有差别 源码附上 <template><view class"marke…...
Spring Boot在线考试系统:JavaWeb技术的应用案例
2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…...
Linux在服务器多节点下面如何快速查找日志
背景:最近在查找一个核心服务的后台日志,发现竟然部署了十几个节点,而且没使用ELK来做日志处理,所以查找日志非常不方便,不可能一个服务节点一个服务地找,所以通过同事间互相沟通找到一个方法,通…...
模数转换ADC0804的应用
【实验目的】 学习如何用单片机控制ADC0804芯片进行数模转换,掌握数码管动态扫描显示的原理。 【实验现象】 拧动AD旁边的电位器,会在数码管的前三位显示0-255之间的数值。 【实验说明】 动态扫描:就六位数码管显示123456举例说明如下&#x…...
CBAM中关于碳关税抵销
碳关税是欧盟为应对气候变化、防止 “碳泄漏” 而推出的一种边境调节机制。该机制的目的就是拉平进口产品与欧盟产品的碳成本,迫使其他国家建立碳市场或征收碳税,提高碳价,以达到和欧盟相同的水平,同时也有助于欧盟实现其气候目标…...
2.5 windows xp,ReactOS系统快速系统调用的实现
windows xp,ReactOS系统快速系统调用的实现 windows xp,ReactOS系统快速系统调用的实现 文章目录 **windows xp,ReactOS系统快速系统调用的实现**快速系统调用进入R0我们看MSR寄存器中的内容到底是啥子快速系统调用返回PspLookupKernelUserE…...
AI助力广交会,人工智能在制造业有哪些应用场景?
随着科技的飞速发展,人工智能(AI)正以前所未有的速度渗透到传统制造业中,为中国传统制造业注入了新的活力与变革,也为中国外贸的持续增长增添了更多底气。 在10月15日—19日举办的第136届中国进出口商品交易会上&…...
ElementPlus-Table表格-单选--TypeScript进阶篇
今天看个例子,这个例子是ElementPlus的组件Table表格下面的单选 <template> <el-table ref"singleTableRef" :data"tableData" highlight-current-row style"width: 100%" current-change"hand…...
三大智能体平台深度对比:字节Coze、百度AppBuilder、智谱智能体优劣解析
字节Coze智能体是一个多功能平台,具备丰富的功能和技能扩展能力。以下是它的一些核心功能和特性: 功能与技能 1. 插件功能 Coze智能体可以通过插件调用外部API,扩展智能体的能力。例如,它可以执行以下操作: 搜索信…...
【Flutter】基础入门:自定义Widget
在 Flutter 开发中,除了使用丰富的内置 Widgets 构建界面外,自定义 Widget 是让你的应用更灵活和个性化的重要手段。Flutter 允许你根据需求自定义 StatelessWidget 和 StatefulWidget,以实现复杂的 UI 组件或功能模块。 本教程将通过实例讲…...
STM32F4实战:手把手教你用DCMI接口驱动OV2640摄像头(附完整代码)
STM32F4实战:从零构建OV2640摄像头驱动系统 1. 硬件连接与信号解析 OV2640摄像头模块与STM32F4的硬件连接需要同时处理电源、控制信号和数据传输三个子系统。我们先拆解这个200万像素摄像头的物理接口特性: 电源部分需要特别注意电压匹配: 核…...
EEG情感分析入门:如何用DEAP数据集里的脑电波区分‘开心’和‘平静’?
EEG情感分析实战:从DEAP数据集解码快乐与平静的脑电密码 当你听到最喜欢的歌曲时,大脑会产生怎样的电信号变化?神经科学研究表明,不同的情绪状态会在大脑活动中留下独特的"指纹"。本文将带你探索如何利用DEAP数据集中的…...
雀巢冰淇淋在华投资的首家冰淇淋工厂迎来成立40周年 | 美通社头条
、美通社消息:近日,雀巢冰淇淋华南生产基地 —— 广州冷冻食品有限公司迎来成立40周年。该工厂是雀巢冰淇淋在华投资的首家冰淇淋工厂,陪伴一代代华南消费者成长的经典甜筒、飞鱼脆皮等产品皆出自广冻厂。1986年,在改革开放的时代…...
衍射光学元件微结构
衍射光学元件(DOEs)是利用刻蚀微结构的衍射特性将入射光束转换为所需光分布的光学元件,利用结构的周期性或无周期性分别创建离散的(分束器)或连续的模式(光束整形器、扩散器)。由于这些元件的工作原理是基于光通过这些图案表面的衍射,因此DOE光束整形器和…...
三步完成微信好友关系一键检测:发现谁偷偷删除了你
三步完成微信好友关系一键检测:发现谁偷偷删除了你 【免费下载链接】WechatRealFriends 微信好友关系一键检测,基于微信ipad协议,看看有没有朋友偷偷删掉或者拉黑你 项目地址: https://gitcode.com/gh_mirrors/we/WechatRealFriends 你…...
别再硬背公式了!用Python手把手带你调参二维卡尔曼滤波(附完整代码与可视化对比)
别再硬背公式了!用Python手把手带你调参二维卡尔曼滤波 卡尔曼滤波作为状态估计的黄金算法,在机器人导航、金融预测、传感器融合等领域有着广泛应用。但许多工程师在掌握基础理论后,面对实际项目时却常常陷入参数调优的困境——那些教科书上的…...
CG-65 剖面细管式温度传感器 小巧便携 多层温度同监测
一、产品概述:小巧便携,功能集成在农业生产、环境监测等诸多领域,土壤温度是一项至关重要的参数。一款性能优异的土壤温度监测设备,能够为相关工作提供精准的数据支持。我们的多深度土壤温度监测仪,正是这样一款专为精…...
城市生活垃圾焚烧过程参数的智能自主设定方法【附程序】
✨ 长期致力于城市生活垃圾、焚烧过程、智能自主、参数设定、设定方法软件研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)基于学习型伪度量方法的焚烧…...
模态生成器:原理详解与推荐开源项目
把一种或多种输入模态,转换、补全或生成另一种目标模态的模块。例如: 文本 → 图像 图像 → 文本 文本 → 语音 语音 → 文本 图像 文本 → 视频 图像 文本 → 机器人动作 图像 → 深度图 / mask / 结构化检测结果 缺失模态 → 伪模态补全在 sVLM / ML…...
避开蓝桥杯LED控制常见坑:STC15单片机P0口上拉、锁存器时序与宏定义的正确写法
避开蓝桥杯LED控制三大雷区:STC15单片机实战精要 第一次参加蓝桥杯嵌入式组的同学,往往会在LED控制这个看似简单的环节栽跟头。明明仿真软件里运行正常的代码,烧录到开发板上却出现LED亮度不足、闪烁异常甚至完全不亮的情况。这背后隐藏着STC…...
