C++之list

list是链表的意思,由一个个节点组成

一、基本接口使用:

(1)与vector相同,有个尾插,也可以使用迭代器遍历:

void test_list1()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);list<int>::iterator it = lt.begin();while (it != lt.end()){cout << *it << " ";it++;}cout << endl;for (auto e : lt){cout << e << " ";}cout << endl;//假如要删除指定位置的数据://it = lt.begin();//lt.erase(it + 3);//物理空间不连续找不到指定位置
}

(2)emplace_back:也是插入,但是和尾插有区别:

假设有一个类A:

struct A
{
public:A(int a1 = 1, int a2 = 1):_a1(a1),_a2(a2){}int _a1;int _a2;};

插入A对象的数据:

void test_list2()
{list<A> lt1;A aa1(1, 1);lt1.push_back(aa1);lt1.push_back(A(2,2));lt1.emplace_back(aa1);lt1.emplace_back(A(2, 2));
}

但是emplace_back支持直接传构造A对象的参数,push_back不支持:

void test_list2()
{list<A> lt1;A aa1(1, 1);lt1.push_back(aa1);lt1.push_back(A(2,2));lt1.emplace_back(aa1);lt1.emplace_back(A(2, 2));//lt.push_back(3, 3);//不支持这样写lt1.emplace_back(3, 3);
}

(3)查询某个值并删除:

void test_list3()
{list<int> lt;lt.push_back(1);lt.emplace_back(2);lt.emplace_back(3);lt.emplace_back(4);for (auto e : lt){cout << e << " ";}cout << endl;//删除某个值:int x;cin >> x;//找到x:auto it = find(lt.begin(), lt.end(), x);if (it != lt.end()){lt.erase(it);}for (auto e : lt){cout << e << " ";}cout << endl;
}

(4)排序:sort()默认是升序,要实现降序可以使用仿函数greater<int> ls,less<int> ls用于升序。lt.sort(ls),这样就可以实现降序。也可以直接传匿名对象lt.sort(greater<int>())。

void test_list4()
{list<int> lt;lt.push_back(1);lt.push_back(20);lt.push_back(3);lt.push_back(5);lt.push_back(4);lt.push_back(6);lt.push_back(1);for (auto e : lt){cout << e << " ";}cout << endl;//排序:lt.sort();//默认实现升序for (auto e : lt){cout << e << " ";}cout << endl;//降序,使用仿函数//less<int> ls;//用于升序//greater<int> ls;//用于降序//两个都是类模板//lt.sort(ls);//这样就实现了降序//也可以直接传匿名对象:lt.sort(greater<int>());for (auto e : lt){cout << e << " ";}cout << endl;
}

(5)两个链表合并:使用merge函数传合并的对象,最后传的对象内部会空。

void test5()
{//两个链表合并:list<double> first, second;first.push_back(3.1);first.push_back(2.2);first.push_back(2.9);second.push_back(3.7);second.push_back(7.1);second.push_back(1.4);first.sort();second.sort();//合并:first.merge(second);//取小的尾插,second最后空了
}

(6)去重:

void test_list6()
{list<int> lt;lt.push_back(1);lt.push_back(20);lt.push_back(5);lt.push_back(5);lt.push_back(4);lt.push_back(6);lt.push_back(1);for (auto e : lt){cout << e << " ";}cout << endl;//去重,先排序:lt.sort();lt.unique();for (auto e : lt){cout << e << " ";}cout << endl;
}

 (7)剪切:有两个链表对象1和2,将2的值剪切到1里面去,最后2会空。

void test_list7()
{list<int> mylist1,mylist2;list<int>::iterator it;for (int i = 1; i <= 4; i++)mylist1.push_back(i);for (int i = 1; i <= 4; i++)mylist2.push_back(i * 10);it = mylist1.begin();it++;mylist1.splice(it, mylist2);//将2的所有值剪切到1里面去for (auto e : mylist1){cout << e << " ";}cout << endl;
}

二、实现一个链表:

(1) 一个链表需要一个类来表示节点,还要一个类来实现链表的链接。

template <class T>
struct list_node//节点
{T _data;list_node<T>* _next;list_node<T>* _prev;list_node(const T& data = T()):_data(data), _next(nullptr), _prev(nullptr){}};
template <class T>
class list
{typedef list_node<T> Node;
public:list(){empty_init();}void empty_init(){_head = new Node();_head->_next = _head;_head->_prev = _head;_size = 0;}size_t size()const {return _size;}bool empty()const{return _size == 0;}
private:Node* _head;size_t _size;
};

用_size来记录节点的个数。

(2)基本的实现:

void push_back(const T& x)
{Node* newnode = new Node(x);Node* tail = _head->_prev;tail->_next = newnode;newnode->_prev = tail;newnode->_next = _head;_head->_prev = newnode;
}void push_front(T& x)
{insert(begin(), x);
}void insert(iterator pos, const T& x)
{Node* cur = pos._node;Node* prev = cur->_prev;Node* newnode = new Node(x);newnode->next = cur;cur->_prev = newnode;newnode->_prev = prev;prev->_next = newnode;++_size;}void pop_back()
{erase(--end());
}void front_back()
{erase(begin);
}

(3)迭代器实现:由于链表在内存内部是不连续的,所以用迭代器的指针无法去直接++或者--,想要实现迭代器的基本功能必须对其他的运算符进行重载。需要写一个专门的类去封装迭代器。使用struct去定义类默认的成员都是公有,这样可以省事很多,方便之后的调用。

首先是重载*,需要返回内部的值,++则是返回下一个节点,--则是返回前一个节点。++和--分为前置和后置,后置则要返回原来的值。

struct list_iterator//默认是公有
{typedef list_node<T> Node;typedef list_iterator<T> Self;Node* _node;list_iterator(Node* node):_node(node){}T& operator*()//重载*{return _node->_data;}Self& operator++(){_node = _node->_next;return *this;}Self& operator--(){_node = _node->_prev;return *this;}Self& operator++(int){Self tmp(*this);_node = _node->_next;return tmp;}Self& operator--(int){Self tmp(*this);_node = _node->_prev;return tmp;}T* operator->(){return &_node->_data;}bool operator !=(const Self& s)//两个迭代器比较{return _node != s._node;}
};

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MWC 2025 | 紫光展锐联合移远通信推出全面支持R16特性的5G模组RG620UA-EU

2025年世界移动通信大会&#xff08;MWC 2025&#xff09;期间&#xff0c;紫光展锐联合移远通信&#xff0c;正式发布了全面支持5G R16特性的模组RG620UA-EU&#xff0c;以强大的灵活性和便捷性赋能产业。 展锐芯加持&#xff0c;关键性能优异 RG620UA-EU模组基于紫光展锐V62…

vue2设置横向滚动指令

图片横向滑动展示效果 创建directives.js文件 // 横向列表拖拽 const draggleScrollX {inserted(el, binding) {let isDragging false;let startX 0;let scrollLeft 0;el.classList.add("draggle-horizontal");// 添加监听事件-鼠标按下const onMouseDown (eve…

城市霓虹灯夜景拍照后期Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色教程 在城市霓虹灯夜景拍摄中&#xff0c;由于现场光线复杂等因素&#xff0c;照片可能无法完全呈现出当时的视觉感受。通过 Lr 调色&#xff0c;可以弥补拍摄时的不足。例如&#xff0c;运用基本调整面板中的曝光、对比度、阴影等工具&#xff0c;可以处理出画面的整体明暗…

20250307确认荣品PRO-RK3566开发板在Android13下的以太网络共享功能

20250307确认荣品PRO-RK3566开发板在Android13下的以太网络共享功能 2025/3/7 13:56 缘起&#xff1a;我司地面站需要实现“太网络共享功能”功能。电脑PC要像连接WIFI热点一样连接在Android设备/平板电脑上来实现上网功能/数据传输。 Android设备/平板电脑通过4G/WIFI来上网。…

清华北大推出的 DeepSeek 教程(附 PDF 下载链接)

清华和北大分别都有关于DeepSeek的分享文档&#xff0c;内容非常全面&#xff0c;从原理和具体的应用&#xff0c;大家可以认真看看。 北大 DeepSeek 系列 1&#xff1a;提示词工程和落地场景.pdf  北大 DeepSeek 系列 2&#xff1a;DeepSeek 与 AIGC 应用.pdf  清华 Deep…

MYSQL之创建数据库和表

创建数据库db_ck &#xff08;下面的创建是最好的创建方法&#xff0c;如果数据库存在也不会报错&#xff0c;并且指定使用utf8mb4&#xff09; show databases命令可以查看所有的数据库名&#xff0c;可以找到刚刚创建的db_ck数据库 使用该数据库时&#xff0c;发现里面没有…

用Python写一个算24点的小程序

一、运行界面 二、显示答案——递归介绍 工作流程&#xff1a; 1. 基本情况&#xff1a;函数首先检查输入的数字列表 nums 的长度。如果列表中只剩下一个数字&#xff0c;它会判断这个数字是否接近 24&#xff08;使用 abs(nums[0] - 24) < 1e-10 来处理浮点数精度问题&…

每天五分钟深度学习框架PyTorch:使用残差块快速搭建ResNet网络

本文重点 前面我们使用pytorch搭建了残差块&#xff0c;本文我们更进一步&#xff0c;我们使用残差块搭建ResNet网络&#xff0c;当学会如何搭建残差块之后&#xff0c;搭建ResNet就会非常简单了&#xff0c;因为ResNet就是由多个残差块组成的。 残差块 残差块我们前面已经介…

Jenkins学习笔记

文章目录 一、Jenkins简介二、Jenkins的安装1. 安装前准备2. 安装Jenkins3. 启动Jenkins 三、Jenkins的配置1. 初始配置2. 全局工具配置3. 插件安装 四、Jenkins的使用1. 创建新任务2. 配置任务3. 触发构建4. 查看构建结果 五、Jenkins的高级功能1. 分布式构建2. 流水线&#x…

Android MXPlayer-v1.86.0-wushidi专业版[原团队最后一个版本]

MXPlayer 链接&#xff1a;https://pan.xunlei.com/s/VOKiDeDUxTDbJNN7yRAZjW8HA1?pwd4bzc# MX Video Player视频播放器是一款安卓最优秀的媒体播放器软件&#xff0c;它能够播放几乎每一个影片档案&#xff0c;并且具备多核心的译码能力来处理你的影片档案和字幕。多核译码…

蓝桥杯—走迷宫(BFS算法)

题目描述 给定一个NM 的网格迷宫 G。G 的每个格子要么是道路&#xff0c;要么是障碍物&#xff08;道路用 11表示&#xff0c;障碍物用 0 表示&#xff09;。 已知迷宫的入口位置为 (x1​,y1​)&#xff0c;出口位置为 (x2​,y2​)。问从入口走到出口&#xff0c;最少要走多少…

【Git】合并冲突

合并冲突 可是&#xff0c;在实际分支合并的时候&#xff0c;并不是想合并就能合并成功的&#xff0c;有时候可能会遇到代码冲突的问题。 为了演示这问题&#xff0c;创建一个新的分支 dev1 &#xff0c;并切换至目标分支&#xff0c;我们可以使用 git checkout -b dev1 一步…

NoSQL数据库系统Cassandra学习笔记

详细文档&#xff1a;我用夸克网盘分享了「noSQL.pdf」&#xff0c;点击链接即可保存。打开「夸克APP」在线查看&#xff0c;支持多种文档格式转换。 链接&#xff1a;https://pan.quark.cn/s/dfc3864807b4 参考链接&#xff1a;黑马程序员NoSQL数据库系统Cassandra全套教程&a…

解锁DeepSpeek-R1大模型微调:从训练到部署,打造定制化AI会话系统

目录 1. 前言 2.大模型微调概念简述 2.1. 按学习范式分类 2.2. 按参数更新范围分类 2.3. 大模型微调框架简介 3. DeepSpeek R1大模型微调实战 3.1.LLaMA-Factory基础环境安装 3.1大模型下载 3.2. 大模型训练 3.3. 大模型部署 3.4. 微调大模型融合基于SpirngBootVue2…

考研408

是否需要考研&#xff1f; 考研前期准备 目标院校 每年9月10月才会公布 考试时长3小时 数据结构 1.时间复杂度选择题计算 2.顺序表链表特点;指针、结构体语法&#xff0c;链表结点定义&#xff0c;链表头结点与头指针,常见的五种链 表&#xff0c;链表的插入删除操作;顺…

SpringCloud系列教程(十三):Sentinel流量控制

SpringCloud中的注册、发现、网关、服务调用都已经完成了&#xff0c;现在就剩下最后一部分&#xff0c;就是关于网络控制。SpringCloud Alibaba这一套中间件做的非常好&#xff0c;把平时常用的功能都集成进来了&#xff0c;而且非常简单高效。我们下一步就完成最后一块拼图Se…

Element Plus中的树组件的具体用法(持续更新!)

const defaultProps {//子树为节点对象的childrenchildren: children,//节点标签为节点对象的name属性label: name, } 属性 以下是树组件中的常用属性以及作用&#xff1a; data&#xff1a;展示的数据&#xff08;数据源&#xff09; show-checkbox&#xff1a;节点是否可…

计算机二级MS之PPT

声明&#xff1a;跟着大猫和小黑学习随便记下一些笔记供大家参考&#xff0c;二级考试之前将持续更新&#xff0c;希望大家二级都能轻轻松松过啦&#xff0c;过了二级的大神也可以在评论区留言给点建议&#xff0c;感谢大家&#xff01;&#xff01; 文章目录 考题难点1cm25px…

TypeError: Cannot convert object to primitive value

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…

虚拟机 | Ubuntu图形化系统: open-vm-tools安装失败以及实现文件拖放

系列文章目录 虚拟机 | Ubuntu 安装流程以及界面太小问题解决 文章目录 系列文章目录虚拟机 | Ubuntu 安装流程以及界面太小问题解决 前言一、VMware Tools 和 open-vm-tools 是什么1、VMware Tools2、open-vm-tools 二、推荐使用open-vm-tools&#xff08;简单&#xff09;1、…