list的模拟实现

embedded/2024/12/22 1:12:03/

目录

1.结构

2.用3个类实现list

3.单个节点的定义

4.迭代器的定义

5.list类的实现

6.vector与list的区别


1.结构

list底层是一个带头双向循环链表

2.用3个类实现list

1.链表中的单个节点

2.迭代器

3.list

由于链表中的迭代器已经不是原生指针,所以将迭代器单独封装成一个类。

list的迭代器是双向迭代器,不能够像string和vector那样的随机迭代器那样可以+3 -3,只能够++和--

3.单个节点的定义

template<class T>
class listnode
{
public:T _data;listnode<T>* _prev;listnode<T>* _next;listnode(const T& x = T()):_data(x),_prev(nullptr),_next(nullptr){}};

4.迭代器的定义

//Ref是T的引用但不知道是不是const迭代器,所以写成模版的形式
//Ptr是T的指针但不知道是不是const迭代器,所以写成模版的形式
//这样就不用单独写一个const迭代器了
template<class T, class Ref, class Ptr>
class list_iterator
{
public:typedef listnode<T> Node;typedef list_iterator<T, Ref, Ptr> Self;Node* _node;//这里的构造函数是为了一会方便提供list类里的begin和end的接口//begin和end接口写在list类里是因为:在List类里才有真正的链表结构list_iterator(Node* node):_node(node){}Ref operator*(){return _node->_data;}Ptr 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;}bool operator!=(const Self& s) const{return _node != s._node;}bool operator==(const Self& s) const{return _node == s._node;}};

5.list类的实现

template<class T>
class List
{typedef listnode<T> Node;public:typedef list_iterator<T, T&, T*> iterator;typedef list_iterator<T, const T&, const T*> const_iterator;//构造哨兵位头结点List(){_head = new Node;_head->prev = _head;_head->next = _head;_size = 0;}iterator begin(){//隐式类型转换,利用迭代器类里的构造函数return _head->next;}iterator end(){//隐式类型转换return _head;}const_iterator begin() const{//隐式类型转换return _head->next;}const_iterator end() const{//隐式类型转换return _head;}void push_back(const T& x){/*Node* newnode = new Node(x);Node* prev = _head->_prev;Node* cur = _head;newnode->_prev = prev;newnode->_next = cur;prev->_next = newnode;cur->_prev = newnode;*/insert(end(), x);}void insert(iterator pos, const T& x){Node* prev = pos->_prev;Node* cur = pos;Node* newnode = new Node(x);newnode->_prev = prev;newnode->_next = cur;prev->_next = newnode;cur->_prev = newnode;_size++;}//返回被删除元素的下一个元素的迭代器,防止迭代器失效iterator erase(iterator pos){Node* prev = pos->_prev;Node* next = pos->_next;prev->_next = next;next->_prev = prev;delete pos;_size--;return next;}//拷贝构造List(const List<T>& s1){_head = new Node;_head->prev = _head;_head->next = _head;_size = 0;for (auto s : s1){push_back(s);}}void swap(List<T> sl){std::swap(_head, sl._head);std::swap(_size, sl._size);}List<T>& operator=(List<T> s1){swap(s1);return *this;}void clear(){iterator it = begin();while (it != end()){it = erase(it);}}~List(){clear();delete _head;_head = nullptr;}int size() const{return _size;}bool empty() const{return _size == 0;}private:Node* _head;int _size;
};

6.vector与list的区别

vector中没有支持头插和头删的接口,但是可以调用insert接口间接头插头删

list中有支持头插头删的接口


http://www.ppmy.cn/embedded/121607.html

相关文章

【环境配置】科研小白Windows下安装Git

2024年小白使用Win10安装Git 2.46.2教程&#xff1a; 1 下载安装包 访问下载地址 Git - Downloading Package (git-scm.com) 下载之后打开文件 2 安装过程 点击Next 2.1 选择安装路径 2.2 选择勾选必要组件 2.3 一路Next 这一步直接Next即可 继续点击Next 继续点击Ne…

算法打卡:第十一章 图论part10

今日收获&#xff1a;Bellman_ford 队列优化算法&#xff08;又名SPFA&#xff09;&#xff0c;bellman_ford之判断负权回路和单源有限最短路 1. Bellman_ford 队列优化算法&#xff08;又名SPFA&#xff09; 题目链接&#xff1a;94. 城市间货物运输 I (kamacoder.com) 思路…

在 Qt 项目中使用 spdlog 的全攻略

目录 1. 准备工作&#xff1a;安装 spdlog 方法一&#xff1a;使用 CMake 的 FetchContent&#xff08;推荐&#xff09; 方法二&#xff1a;手动下载并添加到项目中 2. 在 Qt 项目中集成 spdlog a. 初始化 spdlog b. 在 Qt 的各个部分使用 spdlog 3. 基本使用示例 4. …

rabbitmq----数据管理模块

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 交换机数据管理管理的字段持久化管理类内存管理类申明交换机删除交换机获取指定交换机 队列数据管理管理的字段持久化管理类内存管理类申明/删除/获取指定队列获取所…

足球青训俱乐部管理:Spring Boot技术驱动

摘 要 随着社会经济的快速发展&#xff0c;人们对足球俱乐部的需求日益增加&#xff0c;加快了足球健身俱乐部的发展&#xff0c;足球俱乐部管理工作日益繁忙&#xff0c;传统的管理方式已经无法满足足球俱乐部管理需求&#xff0c;因此&#xff0c;为了提高足球俱乐部管理效率…

【MySQL】基本查询

目录 前言1. 插入1.1 指定列插入1.2 全列插入1.3 插入否则更新1.4 替换 2. 查询2.1 select2.1.1 全列查询2.1.2 指定列查询2.1.3 表达式查询2.1.4 结果去重2.1.5 插入查询结果 2.2 where2.2.1 比较和逻辑运算符2.2.2 条件查询 2.3 order by2.4 分页显示 3. 修改3.1 update 4. 删…

python如何显示数组

np.set_printoptions方法的相关属性&#xff1a; <span style"background-color:#272822"><span style"color:#f8f8d4">set_printoptions(precisionNone, thresholdNone, edgeitemsNone, linewidthNone, suppressNone, nanstrNone, infstrNo…

方舟开发框架(ArkUI)可运行 OpenHarmony、HarmonyOS、Android、iOS等操作系统

ArkUI 是华为开发的一套声明式 UI 开发框架&#xff0c;用于构建分布式应用界面。ArkUI-X 是对 ArkUI 框架的扩展&#xff0c;支持开发者使用一套代码构建支持多平台&#xff08;包括 OpenHarmony、HarmonyOS、Android、iOS&#xff09;的应用。 一、方舟开发框架的ArkUI-X Ark…