当前位置: 首页 > news >正文

波奇学C++:stl的list模拟实现

list是双向带头链表。所以迭代器end()相当于哨兵卫的头。

list不支持+和[]重载,原因在于list空间不是连续的,+和[]的代价比较大。

访问第n个节点,只能用for循环,++来实现

list<int> l;
l.push_back(0);
l.push_back(1);
l.push_back(2);
l.push_back(3);
auto li=l.begin();
//访问第3个节点
for(size_t i=0;i<3;i++)
{li++;
}

list的insert不会失效,但是erase会迭代器失效。

list是双向迭代器

迭代器可以简单分为:单向迭代器(forward)++,双向迭代器(bidirectional) ++/-- 随机迭代器(random acess)+/-/++/--

不同的数据结构的迭代器决定了可以使用不同的算法。其中随机迭代器代器的范围最广,可以用的算法最多。

std:sort只能是随机迭代器用,list不能使用,list也有自己的sort算法但是效率并不高。

list实现

大概思路先不考虑迭代器,链表分为两个类,一个类表示节点,另外一个类表示链表。

节点模板类

template<class T>struct list_node{list_node<T>* _next;list_node<T>* _prev;T _val;list_node(const T& val = T()):_next(nullptr),_prev(nullptr),_val(val){}};

这里有个注意的点,模板类的类名不是类型,list_node只是类名,不是对应的自定义类型,所以是

list_node<T>* _next;而不是list_node* _next。

编译器优化 

拷贝构造写类名也可以

模拟实现的代码

namespace my_list
{template<class T> struct list_node{list_node<T>* _prev;list_node<T>* _next;T _val;list_node(const T& val=T()):_next(nullptr),_prev(nullptr),_val(val){}};template<class T,class Ref,class Ptr>struct __list_iterator{typedef list_node<T> Node;typedef __list_iterator<T, Ref,Ptr> self;Node* _node;__list_iterator(Node* node):_node(node){}Ref operator*(){return _node->_val;}self& operator++(){_node = _node->_next;return *this;}self& operator--(){_node = _node->_prev;return *this;}bool operator!=(const self& it){return _node != it._node;}self operator++(int){self tmp(*this);_node = _node->_next;return tmp;}Ptr operator->(){return &_node->_val;}};template<class T>class list{typedef list_node<T> Node;public:typedef __list_iterator<T,T&,T*> iterator;typedef __list_iterator<T, const T&,const T*> const_iterator;iterator begin(){return _head->_next; }iterator end(){return _head;}const_iterator const_begin(){return _head->_next;}const_iterator const_end(){return _head;}void empty_init(){_head = new Node;_head->_next = _head;_head->_prev = _head;}list(){empty_init();}~list(){clear();delete _head;_head = nullptr;}list(const list<T>& lt){empty_init();for (auto& e : lt){push_back(e);} }void swap(list<T>& lt){std::swap(_head, lt._head);std::swap(_size, lt._size);}list<T>& operator=(list<T> lt){swap(lt);return *this;}~list(){clear();delete _head;_head = nullptr;}void push_back(const T& x){/*Node* tail =_head->_prev;Node* newnode = new Node(x);tail->_next = newnode;newnode->_prev = tail;newnode->_next = _head;_head->_prev = newnode;*/insert(end(), x);}void push_front(const T& x){insert(begin(), x);}void pop_back(){erase(--end());}void pop_begin(){erase(begin());}iterator insert(iterator pos, const T& x){Node* cur = pos._node;Node* prev = cur->_prev;Node* newnode = new Node(x);prev->_next = newnode;newnode->_next = cur;cur->_prev = newnode;newnode->_prev = prev;return newnode;}iterator erase(iterator pos){assert(pos != end());Node* cur = pos._node;Node* prev = cur->_prev;Node* next = cur->_next;prev->_next = next;next->_prev = prev;delete cur;return next;}void clear(){iterator it = begin();while (it != end()){it=erase(it);}}size_t size(){size_t sz = 0;iterator it = begin();while (it != end()){sz++;}return sz;}private:Node* _head;Node* _tail;};
}

相关文章:

波奇学C++:stl的list模拟实现

list是双向带头链表。所以迭代器end()相当于哨兵卫的头。 list不支持和[]重载&#xff0c;原因在于list空间不是连续的&#xff0c;和[]的代价比较大。 访问第n个节点&#xff0c;只能用for循环&#xff0c;来实现 list<int> l; l.push_back(0); l.push_back(1); l.pu…...

Flask 项目结构

前面我们了解了 Flask 框架的特性和一些用法&#xff0c;比如创建一个简单应用、做些页面&#xff0c;以及增加鉴权模块等&#xff0c;如果要将 Flask 用于实际项目开发&#xff0c;还需要了解一下 Flask 项目结构。 Flask 是一个轻量级的 Web 框架&#xff0c;扩展性强&#…...

云计算在IT领域的发展和应用

文章目录 云计算的发展历程云计算的核心概念云计算在IT领域的应用1. 基础设施即服务&#xff08;IaaS&#xff09;&#xff1a;2. 平台即服务&#xff08;PaaS&#xff09;&#xff1a;3. 软件即服务&#xff08;SaaS&#xff09;&#xff1a; 云计算的拓展应用结论 &#x1f3…...

8年测试经验之谈 —— 接口自动化测试requests

1.什么是requests&#xff1f; requests是一个Python第三方库&#xff0c;处理URL资源特别方便 2.安装requests pip3 install requests 如果遇到Permission denied安装失败&#xff0c;请加上sudo重试 3.使用requests 3.1get请求方法 3.1.1基本的get请求 import reques…...

求助:vue从后端获取数据,如何对获得的数据进行拆分?

从后端获取数据格式如下&#xff1a; { "count": 3, "lists": [ { "id": 2, "name_id": 4, "name": "4: 2201030019: 张四", }, { …...

html5拖拽文件上传需阻止默认事件

至少阻止下列3个事件的默认行为才能实现文件拖拽上传 var bdocument.getElementById(box) b.ondragenter(e)>{e.preventDefault()console.log(aaa,e.dataTransfer.files); } b.ondragover(e)>{e.preventDefault()console.log(bb,e.dataTransfer.files); }b.ondrop(e)>…...

深入剖析Kubernetes之Pod基本概念(一)

文章目录 Pod 中重要字段Pod 的生命周期 Pod&#xff0c;而不是容器&#xff0c;才是 Kubernetes 项目中的最小编排单位。将这个设计落实到 API 对象上&#xff0c;容器&#xff08;Container&#xff09;就成了 Pod 属性里的一个普通的字段。那么&#xff0c;到底哪些属性属于…...

idea 对JavaScript进行debug调试

文章目录 1.新增 JavaScript Debug 配置2.配置访问地址3.访问url. 打断点测试 前言 : 工作中接手别人的前端代码没有注释&#xff0c;看浏览器的network或者console切来切去&#xff0c;很麻烦&#xff0c;可以试试idea自带的javscript debug功能。 1.新增 JavaScript Debug 配…...

npm init

1、什么是npm init npm是开源 JavaScript 包管理器&#xff0c;允许 JavaScript 开发人员分享和重用代码。npm init是一种在创建新的npm包时使用的命令&#xff0c;它将提示你填写一些信息以便在package.json文件中创建初始配置。 2、为什么要使用npm init初始化项目 在node…...

微信小程序开发教学系列(6)- 数据缓存与本地存储

第六章 数据缓存与本地存储 在开发微信小程序时&#xff0c;我们通常会面临一个问题&#xff1a;如何在不重复请求接口的情况下&#xff0c;将数据保存在本地&#xff0c;提高用户体验并减少网络请求的次数。这就需要我们学会使用数据缓存和本地存储的技巧。本章将介绍在微信小…...

跟我学c++中级篇——模板的基础术语说明

一、类模板术语 1、模板的特化 模板的特化也叫具体化&#xff0c;非常容易理解&#xff0c;就是把模板中的模板参数给定具体的类型。看下面的例子&#xff1a; //模板 template <typename T,typname N> class Data {}; //特化 template<> class Data<int,int&…...

最新Win10离线安装.NET Framework 3.5的方法(附离线包2022/3/22)

win10系统安装软件时&#xff0c;可能需要.net framework3.5的运行环境&#xff0c;当我们安装某些软件的时候会提示“你的电脑上的应用需要使用以下Windows功能:.NET Framework 3.5(包括.NET 2.0和3.0)。如果系统默认的是4.0以上的版本&#xff0c;当软件需要.net framework3.…...

最新docker多系统安装技术

在Ubuntu操作系统中安装Docker 在Ubuntu操作系统中安装Docker的步骤如下。 1&#xff0e;卸载旧版本Docker 卸载旧版本Docker的命令如下&#xff1a; $ sudo apt-get remove docker docker-engine docker.io 2&#xff0e;使用脚本自动安装 在测试或开发环境中&#xff0…...

系统架构设计高级技能 · 云原生架构设计理论与实践

系列文章目录 系统架构设计高级技能 软件架构概念、架构风格、ABSD、架构复用、DSSA&#xff08;一&#xff09;【系统架构设计师】 系统架构设计高级技能 系统质量属性与架构评估&#xff08;二&#xff09;【系统架构设计师】 系统架构设计高级技能 软件可靠性分析与设计…...

Springboot集成RocketMQ——简单使用

目录 1.MQ选型 2.RocketMQ基本架构 3.Springboot集成RocketMQ 4.顺序消息 5.延时消息 6.事务消息 1.MQ选型 目前市面上的MQ选型&#xff1a;主要分为3个类型 Kafka&#xff1a;吞吐量大&#xff0c;且性能好&#xff0c;集群高可用&#xff1b;会丢失数据&#xff0c;功…...

第一百二十四回 Flexible组件

文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了扩展内容相关的知识&#xff0c;本章回中将介绍 Flexible组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在前面章回中介绍了扩展列表相关的内容&#xff0c;当页面中其它组件和扩展列表一起使…...

关于stm32推挽带有上下拉电阻的思考、IO口驱动能力是什么

1、发现推挽带有上下拉电阻 1.1、stm32手册 记忆中推挽是不需要上下拉的&#xff0c;没关注过&#xff0c;但是我真的理解上下拉吗&#xff0c;下图来自stm32f4的中文版和英文版的数据手册&#xff0c;没有翻译错&#xff0c;就是“推挽带有上下拉的能力”。 1.2、查找相关信…...

考研408 | 【操作系统】 内存管理

内存的基础 内存和内存的作用&#xff1a; 几个常用的数量单位&#xff1a; 指令的工作原理&#xff1a; 问题&#xff1a;如何将指令中的逻辑地址转换为物理地址&#xff1f; 解决办法&#xff1a;装入的三种方式 1.绝对装入 2.可重定位装入 3.动态重定位 从写程序到程…...

C# 工厂模式

一、概述 工厂模式&#xff08;Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;它提供了一种创建对象的最佳方式。在C#中&#xff0c;工厂模式通过定义一个公共接口或抽象类来创建对象&#xff0c;而具体的对象创建则由工厂类来实现。 工厂模式主要包含三个角色…...

在云服务器上安装Jenkins

说明&#xff1a;Jenkins是一个部署项目的平台&#xff0c;通过Jenkins可以省去从项目开发–>部署项目之间的所有流程&#xff0c;做到代码提交即上线。本文介绍在云服务CentOS上安装Jenkins。 前提 安装Jenkins之前&#xff0c;先要在云服务上安装JDK、Maven、Git&#x…...

如何快速配置TranslucentTB:Windows任务栏美化终极教程

如何快速配置TranslucentTB&#xff1a;Windows任务栏美化终极教程 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 想要让Windows任务栏变…...

MAI-UI-8B入门:Node.js环境配置与自动化测试

MAI-UI-8B入门&#xff1a;Node.js环境配置与自动化测试 1. 开篇&#xff1a;为什么选择MAI-UI-8B进行自动化测试 如果你正在寻找一个能够真正理解图形界面、像真人一样操作应用的自动化测试方案&#xff0c;MAI-UI-8B绝对值得关注。这个由阿里通义实验室开源的GUI智能体模型…...

PyTorch 2.8镜像快速部署:5分钟验证torch.cuda.is_available()并启动API服务

PyTorch 2.8镜像快速部署&#xff1a;5分钟验证torch.cuda.is_available()并启动API服务 1. 镜像概述与环境准备 PyTorch 2.8深度学习镜像是一个开箱即用的高性能计算环境&#xff0c;专为现代AI工作负载优化。这个预配置环境能让你跳过繁琐的安装过程&#xff0c;直接进入模…...

2026年Java面试最常被问的1000道题目及参考答案

Java学到什么程度可以面试工作&#xff1f; 要达到能够面试Java开发工作的水平&#xff0c;需要掌握以下几个方面的知识和技能&#xff1a; 1. 基础扎实&#xff1a;熟悉Java语法、面向对象编程概念、异常处理、I/O流等基础知识。这是所有Java开发者必备的基础&#xff0c;也…...

MSPM0G3507开发实战:从零搭建Keil工程与SysConfig配置详解

1. 开发环境准备与SDK文件结构解析 第一次接触MSPM0G3507开发板时&#xff0c;我花了整整两天时间才搞明白SDK文件该怎么用。这里分享我的踩坑经验&#xff0c;帮你省下这些时间。首先确认你的开发环境已经安装以下组件&#xff1a; Keil MDK&#xff1a;建议使用5.33版本&…...

高并发分布式存储系统的设计与实践

高并发分布式存储系统的设计与实践 背景 最近团队需要设计一个支持高并发写入的分布式存储系统&#xff0c;用于处理每天数万亿条数据的写入和查询需求。作为一个在分布式存储领域深耕多年的技术人&#xff0c;我决定分享一下高并发分布式存储系统的设计思路和实践经验。 核心挑…...

UV固化三防漆好用吗?光固化速度与设备要求

UV固化三防漆好用吗&#xff1f;光固化速度与设备要求高效快速的固化优势 UV固化三防漆&#xff08;也称紫外光固化保形涂层&#xff09;是一种专为印刷电路板&#xff08;PCB&#xff09;设计的保护材料&#xff0c;通过紫外光照射触发光引发剂瞬间聚合&#xff0c;实现快速固…...

Python内存监控体系搭建:Prometheus+Custom Metrics+内存火焰图,实现OOM前15分钟精准预警

第一章&#xff1a;Python智能体内存管理策略 Python智能体&#xff08;如基于LLM的Agent、ReAct架构或Tool-Calling Agent&#xff09;在运行过程中频繁创建临时对象、缓存推理上下文、序列化工具调用结果&#xff0c;导致内存压力显著高于常规脚本。其内存管理需兼顾GC效率、…...

小白友好!MogFace本地部署全攻略,从安装到检测只需3步

小白友好&#xff01;MogFace本地部署全攻略&#xff0c;从安装到检测只需3步 1. 工具简介 MogFace是一款基于CVPR 2022论文的高精度人脸检测工具&#xff0c;特别适合需要保护隐私的本地化应用场景。它能够准确识别照片中的多个人脸&#xff0c;无论这些人脸是大是小、是正脸…...

新手零失败指南:利用快马ai轻松完成openclaw的ubuntu环境搭建

最近在学习机器人抓取相关的技术&#xff0c;发现OpenClaw是一个很不错的开源项目。但作为一个Ubuntu新手&#xff0c;在部署过程中遇到了不少坑。经过一番摸索&#xff0c;终于总结出了一套适合新手的零失败部署方案&#xff0c;今天就和大家分享一下。 准备工作 首先确保你的…...