自定义实现list及其功能

在这里插入图片描述

#pragma once
#include <iostream>
#include <assert.h>
using namespace std;

namespace test
{
	//******************************设置结点******************************
	template<class T>
	struct list_node
	{
		T _data;
		list_node<T>* _next;
		list_node<T>* _prev;

		list_node(const T& x = T())
			:_data(x)
			,_next(nullptr)
			,_prev(nullptr)
		{}
	};

	//***************************************定义list迭代器***************************
	// typedeflist iterator<T, T&, T*>           iterator;
	// typedeflist iterator<T, const T&, const T*> const iterator;

	//list_node为结点类
	//template<class T>
	template<class T,class Ref,class Ptr>
	struct __list_iterator
	{
		typedef list_node<T> Node;
		typedef __list_iterator<T,Ref,Ptr> iterator;
		Node* _node;

		//构造函数,浅拷贝
		__list_iterator(Node* node)
			: _node(node)
		{}

		__list_iterator(const iterator& l)
			:_node(l._node)
		{}

		//重载!=
		bool operator!=(const iterator& it)const
		{
			return it._node != this->_node;
		}

		bool operator==(const iterator& s)const
		{
			return _node == s._node;
		}

		//重载 *it it.operator*()
		//T& operator*()
		//{
		//	return _node->_data;
		//}
		//T* operator->()
		//{
		//	return &(operator*());//&(_node->date);
		//}

		Ref operator*()
		{
			return _node->_data;
		}
		Ptr operator->()
		{
			return &(operator*());//&(_node->date);
		}

		//重载++前置
		iterator& operator++()
		{
			_node = _node->_next;
			return *this;
		}
		
		//重载后置++
		iterator operator++(int)
		{
			iterator tmp(*this);
			_node = _node->_next;
			return tmp;
		}

		//重载前置--
		iterator& operator--()
		{
			_node = _node->_prev;
			return *this;
		}

		//重置后置--
		iterator operator--(int)
		{
			iterator tmp(*this);
			_node = _node->_prev;
			return tmp;
		}



	};

	//**************************************模拟实现list******************************************
	//list_node为结点类
	 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;

		 const_iterator begin()const
		 {
			 return const_iterator(_head->_next);
		 }
		 const_iterator end()const
		 {
			 return const_iterator(_head);
		 }

		 iterator begin()
		 {
			 return iterator(_head->_next);
		 }
		 iterator end()
		 {
			 return iterator(_head);
		 }

		 iterator insert(iterator pos, const T& x)
		 {
			 Node* cur = pos._node;
			 Node* prev = cur->_prev;

			 Node* newnode = new Node(x);

			 prev->_next = newnode;
			 newnode->_prev = prev;
			 newnode->_next = cur; 
			 cur->_prev = newnode;
			 ++size;
			 return iterator(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;
			 size--;
			 return iterator(next);
		 }

		 void push_back(const T& x)
		 {
			 //Node* tail = _head->_prev;
			 //Node* newnode = new Node(x);

			 _head  tail  newnode
			 //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_front()
		 {
			 erase(begin());
		 }

		 void clear()
		 {
			 iterator it = begin();
			 while (it != end())
			 {
				 erase(it++);
			 }
			 size = 0;
		 }

		 void empty_init()
		 {
			 //创建并初始化哨兵位头结点
			 _head = new Node;
			 _head->_next = _head;
			 _head->_prev = _head;
			 size = 0;
		 }

		 void swap(list<T>& x)
		 {
			 std::swap(_head, x._head);
			 std::swap(size, x.size);
		 }

		 //构造函数
		 list()
		 {
			 /*_head = new Node;
			 _head->_next = _head;
			 _head->_prev = _head;*/
			 empty_init();
		 }

		 //模板构造函数初始化
		 template <class InputIterator>
		 list(InputIterator first, InputIterator last)
		 {
			 empty_init();
			 while (first != last)
			 {
				 push_back(*first);
				 ++first;
			 }
		 }

		 list(const list<T>& lt)
		 {
			 empty_init();

			 list<T> tmp(lt.begin(), lt.end());
			 swap(tmp);
		 }

		 list<T>& operator=(list<T> lt)
		 {
			 swap(lt);
			 return *this; 
		 }

		 size_t _size()
		 {
			 return size;
		 }
		 //析构函数
		 ~list()
		 {
			 clear();
			 delete _head;
			 _head = nullptr;
		 }
		 

	 private:
		 Node* _head;
		 size_t size = 0;
	 };

值得我们注意一下的是
在这里插入图片描述

struct Pos
	 {
		 int _a1;
		 int _a2;
		 Pos(int a1 = 0, int a2 = 0)
			 :_a1(a1)
			 ,_a2(a2)
		 {}
	 };
void test_list2()
	 {
		 int x = 10;
		 int* p1 = &x;
		 cout << *p1 << endl;


		 //多会用 . 多会用->
		 Pos aa;
		 Pos* p2 = &aa;
		 aa._a1;
		 p2->_a1;

		 list<Pos> lt;

		 lt.push_back(Pos(10, 20));
		 lt.push_back(Pos(10, 21));

		 list<Pos>::iterator it = lt.begin();
		 while (it != lt.end())
		 {
			 //cout << (*it)._a1 << " : " << (*it)._a2 << endl;
			 //it->是it.operator->()的类型(T*)
			 //语法为了可读性,编译器进行了特殊处理,省略了一个->

			 //return &(operator*());//&(_node->date);
			 cout << it->_a1 << " : " << it->_a2 << endl;
			 //原型cout << it->->_a1 << " : " << it->->_a2 << endl;
			 ++it;
		 }
		 cout << endl;
	 }

在这里我们注意到如果listpush的是一个结构体时,我们在使用->重载时,语法为了可读性,编译器进行了特殊处理,省略了一个->,正常情况为cout << it->->_a1 << " : " << it->->_a2 << endl;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

每天一道C语言编程练习(5):尼科彻斯定理

题目描述 验证尼科彻斯定理&#xff0c;即&#xff1a;任何一个整数m的立方都可以写成m个连续奇数之和。 输入格式 任一正整数 输出格式 该数的立方分解为一串连续奇数的和 样例输入 13 样例输出 13*13*132197157159161163165167169171173175177179181 代码如下&#…

WebSocket理论和实战

一 WebSocket理论 1.1 什么是http请求 http链接分为短链接、长链接&#xff0c;短链接是每次请求都要三次握手才能发送自己的信息。即每一个request对应一个response。长链接是在一定的期限内保持链接&#xff08;但是是单向的&#xff0c;只能从客户端向服务端发消息&#x…

Linux: cannot read file data

报错&#xff1a; Could not load library libcudnn_cnn_infer.so.8. Error: /home/qc/miniconda3/envs/DNAqc/lib/python3.10/site-packages/torch/lib/libcudnn_cnn_infer.so.8: cannot read file data Please make sure libcudnn_cnn_infer.so.8 is in your library path! A…

IDEA启动tomcat控制台中文乱码问题

IntelliJ IDEA是很多程序员必备且在业界被公认为最好的Java开发工具&#xff0c;有很多小伙伴在安装完IDEA并且tomcat之后&#xff0c;启动tomcat会出现控制台中文乱码问题&#xff0c;如下图所示&#xff1a; 具体解决步骤&#xff1a; 一、修改当前 Web 项目 Tomcat Server…

基于XPopup实现的弹窗效果

基于XPopup实现的弹窗效果&#xff1a; implementation com.github.li-xiaojun:XPopup:2.9.191、底部弹窗(BottomPopupView) class OutlinkDealDialog(context: Context,private val selectClickCallback: ((index: Int) -> Unit)? null, ) : BottomPopupView(context) {…

【岛屿最大面积】BJ某IT厂笔试题

该题在LeetCode上能找到原题&#xff0c;大致意思是&#xff0c;给你一个大小为 m x n 的二进制矩阵 grid 。岛屿 是由一些相邻的 1 (代表土地) 构成的组合&#xff0c;这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0&…

浅谈一下企业IT运维痛点以及好用的运维软件推荐

随着IT建设的不断深入和完善&#xff0c;IT资产越来越多&#xff0c;IT运维管理越发显得重要。但不少企业不知道如何有效进行IT运维&#xff0c;不知道如何更好进行IT运维&#xff0c;今天我们就来一起浅谈一下企业IT运维痛点&#xff0c;以及给大家推荐一款好用的运维管理软件…

visual studio配置调用c++ dll opencv为例

1&#xff0c;配置VC目录&#xff0c;包含目录和库目录。 2&#xff0c;链接器->输入->包含目录 3&#xff0c;生成目录下包含对应的dll文件 4&#xff0c;需注意对应的Debug&#xff0c;Release及X86&#xff0c;X64选项

IP库新增多种颜色转换空间IP

颜色空间转换是图像及视频中常用的解决方案&#xff0c;涉及hsv-rgb、rgb-ycrcb等一些常见的颜色空间互相转换&#xff0c;今天带来几种常见的颜色空间转换IP&#xff0c;主要如下&#xff1a; IP库简介 一直想做一个可以供大家学习、使用的开源IP库&#xff0c;类似OpenCores&…

利用鸿鹄优化共享储能的SCADA 系统功能,赋能用户数据自助分析

摘要 本文主要介绍了共享储能的 SCADA 系统大数据架构&#xff0c;以及如何利用鸿鹄来更好的优化 SCADA 系统功能&#xff0c;如何为用户进行数据自助分析赋能。 1、共享储能介绍 说到共享储能&#xff0c;可能不少朋友比较陌生&#xff0c;下面我们简单介绍一下共享储能的价值…

行为型模式 - 模板方法模式

概述 在面向对象程序设计过程中&#xff0c;程序员常常会遇到这种情况&#xff1a;设计一个系统时知道了算法所需的关键步骤&#xff0c;而且确定了这些步骤的执行顺序&#xff0c;但某些步骤的具体实现还未知&#xff0c;或者说某些步骤的实现与具体的环境相关。 例如&#…

Docker 基本管理与应用

目录 一、Docker介绍 1、docker概述 2、容器优势 3、Docker与虚拟机的区别 4、Docker核心概念 二&#xff1a; 安装 Docker 1、环境准备、安装依赖包 2、 设置阿里云镜像源&#xff0c;安装 Docker-CE并设置为开机自动启动 3、信息查看 ​三&#xff1a;Docker 镜像操作…

XSS简介

OWASP TOP 10 OWASP(开放式Web应用程序安全项目)的工具&#xff0c;文档&#xff0c;论坛额全球各地分会都是开放的&#xff0c;对所有致力于改进应用程序安全的人士开放&#xff0c;最具权威的就是10项目最严重的Web应用程序安全风险列表 Cross Site Scripting&#xff08;X…

使用Vue的插件clipboard使用复制功能

1.安装clipboard插件 npm install clipboard 2.使用 clipboard <template><div style"margin-right: auto;margin-left: auto; 800px"><el-table :data"list"><el-table-column label"搜索引擎" prop"name"&g…

cesium实战(1)、cesium 加载本地json、GeoJson数据

1、cesium加载本地图层json图层数据 并设置样式 添加图层 // 加载路网数据 wms数据服务let addRoadLayer () > {Cesium.GeoJsonDataSource.load(/cesium/layers/road_84.json, {stroke: Cesium.Color.YELLOW,//多边形或线的颜色 strokeWidth: 3,//多边形或线 宽度clampToG…

【优选算法题练习】day6

文章目录 一、76. 最小覆盖子串1.题目简介2.解题思路3.代码4.运行结果 二、704. 二分查找1.题目简介2.解题思路3.代码4.运行结果 三、34. 在排序数组中查找元素的第一个和最后一个位置1.题目简介2.解题思路3.代码4.运行结果 总结 一、76. 最小覆盖子串 1.题目简介 76. 最小覆…

Selenium(3 + 4 超级详细笔记)

文章目录 selenium&#xff08;web自动化测试&#xff09;1. selenium初始化&#xff08;2种&#xff09;2. chrome 启动参数&#xff08;3种&#xff09;3. 八大定位方式3.1 css 定位3.2 xpath 定位3.3 link_text 定位3.4 partial_link_text 定位3.5 relative 相对定位 4. 添加…

OpenCv之图像轮廓

目录 一、图像轮廓定义 二、绘制轮廓 三、计算轮廓面积与周长 一、图像轮廓定义 图像轮廓是具有相同颜色或灰度的连续带你的曲线.轮廓在形状分析和物体的检测和识别中很有用 轮廓的作用: 用于图形分析物体的识别与检测 注意点: 为了检测的准确性&#xff0c;需要先对图像…

采集传感器的物联网网关怎么采集数据?

随着工业4.0和智能制造的快速发展&#xff0c;物联网&#xff08;IoT&#xff09;技术的应用越来越广泛&#xff0c;传感器在整个物联网系统中使用非常普遍&#xff0c;如温度传感器、湿度传感器、光照传感器等&#xff0c;对于大部分物联网应用来说&#xff0c;采集传感器都非…

JVM系统优化实践(20):GC生产环境案例(三)

您好&#xff0c;这里是「码农镖局」CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e; 某新手开发工程师接到了一个保存Elasticsearch日志的任务&#xff0c;以供后续分析之用。但写代码的时候&#xff0c;误将保存日志的代码段弄成了无限循环&#xff0c;程序…