IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> [19] C++STL容器篇之list简单模拟 -> 正文阅读

[系统运维][19] C++STL容器篇之list简单模拟

C++STL容器篇之list简单模拟

其实就是双向链表,然后使用C++封装而且,底层代码就是双向链表,直接看代码就好。

.hpp文件

#pragma
#include <iostream>
using namespace std;

template <class Ty>
struct Node
{
	Node<Ty>* left;
	Ty data;
	Node<Ty>* right;
	Node(Ty data) :data(data), left(nullptr), right(nullptr){}
	Ty& getData() { return this->data; }
};

template <class T>
class MyList
{
public:
	MyList()
	{
		firstNode = nullptr;
		lastNode = nullptr;
		listSize = 0;
	}
	ostream& operator<<(ostream& out)
	{
		out << this->firstNode->data;
		return out;
	}
	bool empty() { return listSize == 0; }
	int size() { return listSize; }
	Node<T>& front() { return *firstNode; }
	Node<T>& back() { return *lastNode; }
	Node<T>* first() { return firstNode; }
	Node<T>* last() { return lastNode; }
	void printList()
	{
		Node<T>* pMove = firstNode;
		while (pMove!=lastNode->right)
		{
			cout << pMove->getData() << '\t';
			pMove = pMove->right;
		}
		cout << endl;
	}
	void push_front(T data)
	{
		Node<T>* newNode = new Node<T>(data);
		if (listSize == 0)
			lastNode = newNode;
		else
		{
			newNode->right = firstNode;
			firstNode->left = newNode;
		}
		firstNode = newNode;
		listSize++;
	}

	void push_back(T data)
	{
		Node<T>* newNode = new Node<T>(data);
		if (listSize == 0)
			firstNode = newNode;
		else
		{
			newNode->left = lastNode;
			lastNode->right = newNode;
		}
		lastNode = newNode;
		listSize++;
	}

	void pop_front()
	{
		if (listSize == 0)
			return;
		else if (listSize == 1)
		{
			delete firstNode;
			firstNode = nullptr;
			lastNode = nullptr;
		}
		else
		{
			Node<T>* pDelete = firstNode;
			firstNode = firstNode->right;
			pDelete->right = nullptr;
			firstNode->left = nullptr;
			delete pDelete;
			pDelete = nullptr;
		}
		listSize--;
	}

	void pop_back()
	{
		if (listSize == 0)
			return;
		else if (listSize == 1)
		{
			delete lastNode;
			lastNode = nullptr;
			firstNode = nullptr;
		}
		else
		{
			Node<T>* pDelete = lastNode;
			lastNode = lastNode->left;
			pDelete->left = nullptr;
			lastNode->right = nullptr;
			delete pDelete;
			pDelete = nullptr;
		}
		listSize--;
	}

	//迭代器部分

	class iterator
	{
	public:
		iterator() = default;
		iterator(Node<T>* pMove):pMove(pMove){}
		T& operator*()
		{
			return this->pMove->data;
		}
		iterator operator++(int)
		{
			return this->pMove = this->pMove->right;
		}
		iterator operator++()
		{
			return this->pMove = this->pMove->right;
		}
		iterator operator--(int)
		{
			return this->pMove = this->pMove->left;
		}
		iterator operator--()
		{
			return this->pMove = this->pMove->left;
		}
		bool operator!=(iterator obj)
		{
			return this->pMove != obj.pMove;
		}

	protected:
		Node<T>* pMove;
	};
	iterator begin() { return iterator(firstNode); }
	iterator end() { return iterator(lastNode->right); }

protected:
	Node<T>* firstNode;
	Node<T>* lastNode;
	int listSize;
};

主函数测试

#include <iostream>
#include "MyList.hpp"
using namespace std;
int main()
{
	MyList<int> mylist;
	for (int i = 0; i < 3; i++)
	{
		mylist.push_front(i);
	}
	mylist.printList();
	cout << mylist.size() << endl;
	mylist.pop_back();

	mylist.printList();
	cout << mylist.size() << endl;
	for (int i = 6; i < 10; i++)
	{
		mylist.push_back(i);
	}
	for (auto v : mylist)
	{
		cout << v << '\t';
	}
	cout << endl;
	cout << "=====================" << endl;
	MyList<int>::iterator iter;
	for (iter = mylist.begin(); iter != mylist.end(); iter++)
	{
		cout << *iter << '\t';
	}
	cout << endl;
	cout << "当前链表的大小为:" << mylist.size() << endl;
	while (!mylist.empty())
	{
		cout << mylist.front().data << '\t';
		mylist.pop_front();
	}
	cout << endl;
	cout << "当前链表的大小为:" << mylist.size() << endl;
	return 0;
}
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-10-12 23:53:40  更:2021-10-12 23:54:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 18:48:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码