c++_list模仿库实现

1 list的概念

stl中的链表

2 链表的概念

开辟一块空间(一个节点),该空间包括需要储存的数据和下一个节点的地址

最简单的单链表:

为了更方便给链表加上一个头表示开始,以及上一个节点的地址变成带头双向链表:

带头双向链表:

3 模拟库实现list需要实现的类,迭代器,成员函数极其作用

3.1list的迭代器类

3.2链表节点类

3.3预备模拟实现的list成员函数

4 各种需要的类,迭代器与list成员函数代码

4.1节点类(代码)

// List的节点类

template<class T>

struct ListNode

{

//构造函数

ListNode(const T& val = T())

:_pPre(nullptr)

, _pNext(nullptr)

, _val(val)

{}

ListNode<T>* _pPre;

ListNode<T>* _pNext;

T _val;

};

4.2list的迭代器(代码)

//List的迭代器类

//为了保证const_itreator和itreator的区别定义的模板类

template<class T, class Ref, class Ptr>

struct ListIterator

{

typedef ListNode<T>* PNode;

//typedef ListIterator<T, T&, T*> iterator;

//typedef ListIterator<T, const T&, const T*> const_iterator;

typedef ListIterator<T, Ref, Ptr> Self;

//构造

ListIterator(PNode pNode = nullptr)

:_pNode(pNode)

{}

//拷贝构造

ListIterator(const Self& x)

{

_pNode = x._pNode;

}

//返回对节点数据的引用/const引用

Ref operator*()

{

return _pNode->_val;

}

//返回节点数据的指针/const指针

Ptr operator->()

{

return &_pNode->_val;

}

//前置++

//ListNode<T>* PNode

// //这个迭代器是一个节点指针

//*this即ListNode<T>节点本身,this指向迭代器本身

Self& operator++()

{

_pNode = _pNode->_pNext;

return *this;

}

//后置++

//返回拷贝

Self operator++(int)

{

PNode _ptmp = _pNode;

_pNode = _pNode->_pNext;

return _ptmp;

}

PNode _pNode;

};

4.3list成员函数(代码)

//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;

public:

// List的构造

list()

{

_pHead = new Node;

_pHead->_pNext = _pHead;

_pHead->_pPre = _pHead;

_size = 0;

}

// List Iterator

iterator begin()

{

iterator it;

it._pNode = _pHead->_pNext;

return it;

}

iterator end()

{

iterator it;

it._pNode = _pHead;

return it;

}

List Modify

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)

{

PNode n_tmp = new Node;

//pos的地址

n_tmp->_pNext = pos._pNode;

//pos上一个节点的地址

n_tmp->_pPre = pos._pNode->_pPre;

n_tmp->_val = val;

//pos节点的上一个节点的下一个节点地址

pos._pNode->_pPre->_pNext = n_tmp;

//pos节点的上一个节点地址

pos._pNode->_pPre = n_tmp;

++_size;

return n_tmp;

}

private:

//节点指针

PNode _pHead;

int _size;

};

相关推荐
BK贝壳28 分钟前
亿级用户签到位图选型复盘:用 bool-hybrid-array 扛冷启动打卡,也把它和 Roaring/Redis 的边界测清楚了
数据结构·python·性能优化·numpy
2601_966949652 小时前
如何根据研究的起止时间截取分钟级行情?Python 实战与 QuantDash 数据处理指南
开发语言·python·pandas·量化交易·1024程序员节·股票数据·quantdash
晨曦中的暮雨4 小时前
限流算法——固定窗口、滑动窗口、漏桶、令牌桶
java·开发语言·算法
喵了几个咪5 小时前
GoWind CMS 拆解:在 Go 里给 TipTap 搭一套 Yjs 协同后端
开发语言·后端·golang
程序员清风5 小时前
数据处理脚本工程化:日志、配置、命令行与测试
服务器·开发语言·数据库
学长毕设5 小时前
基于SpringBoot的青少年编程学习平台系统-附源码
spring boot·学习·青少年编程
2601_962885727 小时前
如何用 Python 把 K 线重采样成任意周期?
开发语言·python
choumin7 小时前
C++中万能引用与std::forward的作用和用法
c++·万能引用·std forward
Wang's Blog7 小时前
Java 项目实战: 交友项目 - 圈子功能实现:总结
java·开发语言·交友
下一站春风里8 小时前
位运算完整学习笔记:按位与(&)+ 异或(^)
开发语言·c++·算法