一文学会c++list

文章目录

  • list简介
  • list接口
  • 迭代器失效
  • 🚩模拟实现

list简介

1,list是可以在常数时间复杂度任何位置随意插入的序列式容器,可以双向迭代
2,底层是双向链表结构,每个节点都是独立的,通过前后指针链接
3,相比vector,list随机插入更快,但是要访问随机元素更复杂,需要线性时间开销;还需要额外空间开销(保存前后指针);

list接口

和前文的string,vector接口一致,这里就不赘述了,无非多了头插头删
vector讲解

迭代器失效

与前文的vector一样,如果指针指向当前位置被释放,再访问就会崩溃

#include <iostream>
#include <list>
using namespace std;
int main()
{int a[] = {4, 5, 6};list<int> l1(a, a + sizeof(a) / sizeof(int));auto it = l1.begin();while(it!=l1.end()){cout << *it;//l1.erase(it);//it++;//错误it = l1.erase(it);//正确}return 0;
}

🚩模拟实现

#include <iostream>
namespace jib {template<class T>struct ListNode{ListNode(const T& val = T()):_prev(nullptr),_next(nullptr),_val(val){}ListNode<T>* _prev;ListNode<T>* _next;T _val;};template<class T, class Ref, class Ptr>struct ListIterator{typedef ListNode<T> Pnode;typedef ListIterator<T, Ref, Ptr> self;Pnode* _node;ListIterator(Pnode* pnode = nullptr):_node(pnode){}ListIterator(const self& l):_node(l._node){}Ref operator*(){return _node->_val;}Ptr operator->(){return &_node->_val;}self& operator++(){_node=_node->_next;return *this;}self operator++(int){self tmp(*this);_node = _node->_next;return tmp;}self& operator--(){_node = _node->_prev;return *this;}self operator--(int){self tmp(*this);_node = _node->_prev;return tmp;}bool operator!=(self& l) const{return _node != l._node;}bool operator==(self& l) const{return !(*this!=l);}};template<class T>class list {typedef ListNode<T> Node;public:typedef ListIterator<T, T&, T*> iterator;typedef ListIterator<T, const T&, const T*> const_iterator;list(){CreateNode();}list(int n, const T& value = T()){CreateNode();for(int i=0;i<n;i++){push_back(value);}}template <class Iterator>list(Iterator first, Iterator last){CreateNode();while (first != last){push_back(*first);++first;}}list(const list<T>& l){CreateNode();list<T> tmp(l.begin(),l.end());this->swap(tmp);}list<T>& operator=(const list<T> l){this->swap(l);return *this;}~list(){clear();delete _phead;_phead = nullptr;}///////////////////////////////////////////////////////////////// List Iteratoriterator begin(){return iterator(_phead->_next);}iterator end(){return iterator(_phead);}const_iterator begin() const{return const_iterator(_phead->_next);}const_iterator end() const{return const_iterator(_phead);}///////////////////////////////////////////////////////////////// List Capacitysize_t size()const{size_t sz = 0;Node* p = _phead->_next;while (p != _phead){sz++;p = p->_next;}return sz;}bool empty()const{return size() == 0;}////////////////////////////////////////////////////////////// List AccessT& front(){access(!empty());return _phead->_next->_val;}const T& front()const{access(!empty());return _phead->_next->_val;}T& back(){access(!empty());return _phead->_prev->_val;}const T& back()const{access(!empty());return _phead->_prev->val;}////////////////////////////////////////////////////////////// List Modifypublic:void 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){Node* newnode = new Node(val);Node* cur=pos._node;newnode->_prev = cur->_prev;newnode->_next = cur;cur->_prev->_next = newnode;cur->_prev = newnode;return iterator(newnode);}iterator erase(iterator pos){Node* cur = pos._node;Node* curnext = cur->_next;curnext->_prev = cur->_prev;cur->_prev->_next = curnext;delete cur;cur = nullptr;return iterator(curnext);}void clear(){iterator p = begin();while (!empty()){p = erase(p);}_phead->_next = _phead;_phead->_prev = _phead;}void swap(list<T>& l){std::swap(_phead, l._phead);}private:void CreateNode(){_phead = new Node;_phead->_next = _phead;_phead->_prev = _phead;}Node* _phead;};
}

先开辟节点类,再开辟迭代器类,再创建list类
注意 it用法:

struct Person {std::string name;int age;void print() { std::cout << name << ", " << age; }
};jib::list<Person> people;
people.push_back(Person{"Alice", 30});auto it = people.begin();
std::cout << it->name;  // 输出 "Alice"
it->age = 31;           // 修改年龄
it->print();            // 调用成员函数

调用 it.operator->(),返回 &_node->_val
编译器自动对结果应用 ->,变成== (&_node->_val)->name==

编译器自动省略了一个->

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

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

相关文章

数据集分享 | 智慧农业实战数据集精选

【导读】 在智慧农业的发展浪潮下&#xff0c;AI视觉算法正逐步渗透进作物生长监控、病虫害检测、采摘成熟评估等细分任务。相较于工业或城市场景&#xff0c;农业视觉更具挑战性&#xff1a;自然环境复杂、目标形态多变、时空尺度差异大。 为实现精准农业管理&#xff0c;一…

CCFRec-人大高瓴-KDD2025-序列推荐中充分融合协同信息与语义信息

文章目录1. 背景与问题2. 方法2.1 多视图 sid2.2 Code-Guided Semantic Fusion核心创新&#xff1a;常规操作&#xff1a;2.3 Enhanced Representation Learning via Code Masking2.3.1 Masked Code Modeling (MCM)2.3.2 Masked Sequence Alignment (MSA)2.4 复杂度分析2.4.1 训…

Python深入 Tkinter 模块

目录 一、为什么要写 Tkinter 二、最小可运行示例&#xff1a;Hello World 不是终点&#xff0c;而是起点 三、布局三板斧&#xff1a;pack、grid、place 四、事件与回调&#xff1a;让按钮“响”起来 五、实战案例&#xff1a;秒表 文件批量重命名器 六、样式进阶&…

LeetCode 面试经典 150_数组/字符串_删除有序数组中的重复项(3_26_C++_简单)

LeetCode 面试经典 150_删除有序数组中的重复项&#xff08;3_26_C_简单&#xff09;题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;双指针&#xff09;&#xff1a;代码实现代码实现&#xff08;思路一&#xff08;双指…

架构篇(一):告别MVC/MVP,为何“组件化”是现代前端的唯一答案?

架构篇(一)&#xff1a;告别MVC/MVP&#xff0c;为何“组件化”是现代前端的唯一答案&#xff1f; 引子&#xff1a;一个困扰前端工程师的“幽灵” 在上一章《序章&#xff1a;抛弃UI&#xff0c;我们来构建一个“看不见”的前端应用》中&#xff0c;我们从零开始构建了一个纯…

数组内存学习

一、内存简介&#xff1a;1.内存分为5块&#xff1a;a.栈&#xff08;Stack&#xff09;主要运行方法&#xff0c;方法的运行都会进入栈内存运行&#xff0c;云南行完毕之后&#xff0c;需要“弹栈”&#xff0c;为了腾空间。b.堆&#xff08;Heap&#xff09;保存的是对象&…

验证 GitHub Pages 的自定义域(Windows)

验证 GitHub Pages 的自定义域 您可以通过验证您的域来提高自定义域的安全性并避免接管攻击。 谁可以使用此功能? GitHub Pages 在公共存储库中提供 GitHub Free 和 GitHub Free for organizations,在公共和私有存储库中提供 GitHub Pro、GitHub Team、GitHub Enterprise Cl…

数字化转型 - 企业数字化建设的几点思考

关于企业数字化建设的几点思考工业软件领军人才的培训课中&#xff0c;如上的一个PPT&#xff0c;给人以许多反思。一是看企业成功的数字化案例时&#xff0c;也许只看到别人面上的东西&#xff0c;可能还有面下很多看不到的东西支撑着&#xff0c;因此可能只看到或学到别人的皮…

深入解析Java内存模型:原理与并发优化实践

深入解析Java内存模型&#xff1a;原理与并发优化实践 技术背景与应用场景 随着多核处理器的普及&#xff0c;Java并发编程已成为后端系统提升吞吐量与响应性能的必备手段。然而&#xff0c;在多线程环境下&#xff0c;不同线程对共享变量的可见性、指令重排以及内存屏障控制都…

《设计模式之禅》笔记摘录 - 9.责任链模式

责任链模式的定义责任链模式定义如下&#xff1a;Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it.…

05-ES6

数据解构SetES6 提供了新的数据结构 Set。它类似于数组&#xff0c;但是成员的值都是唯一的&#xff0c;没有重复的值Set 本身是一个构造函数&#xff0c;用来生成 Set 数据结构//set集合&#xff0c;成员是唯一的,添加过程中会替换相同的元素。这里相同的标准是const s new S…

正则表达式 \b:单词边界

下面举例说明 \b 用法。\b(?:https?://)(\S)\b各部分功能&#xff1a;\b&#xff1a;单词边界&#xff0c;确保匹配的 URL 是独立的单词&#xff0c;不会与其他字符粘连。(?:https?://)&#xff1a;非捕获组&#xff0c;匹配 http:// 或 https://&#xff08;s? 表示 s 可…

从8h到40min的极致并行优化:Spark小数据集UDTF处理的深度实践与原理剖析

在大数据领域&#xff0c;Spark以其卓越的并行处理能力著称。但面对小数据集的极致并行需求时&#xff0c;默认优化策略往往成为瓶颈。本文将深入剖析如何通过精准控制分区策略&#xff0c;将仅170条数据的表拆分成170个独立Task并行执行&#xff0c;实现100%的并行度&#xff…

JAVA算法题练习day1

开始前&#xff1a; 选择leetcode-hot100。要求每日1道&#xff0c;并且需要亲自二刷昨天的题目&#xff08;每一种解法&#xff09;&#xff0c;要做解题笔记并发布CSDN&#xff0c;做完立刻二刷。做题时间为每日12&#xff1a;50起&#xff0c;不拖延&#xff0c;这是学习成…

【Word Press进阶】自定义区块的行为与样式

前两篇 【Word Press基础】创建自定义区块【Word Press基础】创建一个动态的自定义区块 说明白了怎么创建一个简单的静态区块。但实在是太丑了。这里再进行一个优化&#xff0c;让咱们的区块好看又好用。 一个合格的区块应当有着好看的外表&#xff0c;完整的功能&#xff0…

Pygame模块化实战:火星救援游戏开发指南

Pygame模块化实战&#xff1a;火星救援游戏开发指南用Python打造太空探险游戏&#xff0c;掌握模块化开发核心技巧一、火星救援&#xff1a;模块化开发的完美场景​​想象这样的场景​​&#xff1a; 你是一名宇航员&#xff0c;被困在火星表面&#xff0c;需要收集资源、修复飞…

三维图像识别中OpenCV、PCL和Open3D结合的主要技术概念、部分示例

文章目录1. 三维点云基础概念点云(Point Cloud)深度图像(Depth Image)体素(Voxel)2. 点云预处理技术去噪滤波(Noise Filtering)降采样(Downsampling)3. 特征提取与描述法向量估计(Normal Estimation)关键点检测(Keypoint Detection)特征描述子(Feature Descriptor)4. 点云配准(…

7.23数据结构——单链表

文章目录一、思维导图二、单链表代码head.htext.cmain.c现象一、思维导图 二、单链表代码 head.h #ifndef __HEAD_H__ #define __HEAD_H__#include <stdlib.h> #include <stdio.h> #include <string.h>enum A {FAULSE-1,//失败返回SUCCESS//成功返回};//给…

某种物联网SIM卡流量查询方法

说起流量卡,很多人可能还停留在营业厅办理的常规套餐里。但其实在 2016 年,三大运营商就推出了一种资费更为划算的正规流量卡 —— 物联卡。当年,当不少人还在用 50 元 1G 的流量时,第一批体验物联卡的用户已经享受到了 53 元 6G 的全国流量,彻底摆脱了流量焦虑。不过,至…

XTTS实现语音克隆:精确控制音频格式与生成流程【TTS的实战指南】

言简意赅的讲解XTTS解决的痛点 &#x1f4ce; 前置操作&#xff1a;如何使用 OBS Studio 录制高质量 WAV 语音&#xff08;建议先阅读并准备录音样本&#xff09; 本教程介绍如何使用 Coqui TTS 的 XTTS v2 模型 实现中文语音克隆&#xff0c;支持直接传入 .wav 文件&#xff0…