自定义实现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;

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ES6 Generator和Promise

目录 Generator 如何创建Generator函数 ? 模拟发起异步请求 Promise 实例化 实例方法 工厂函数 静态方法 Promise.all([p1,p2,....]) Promise.race([p1,p2,....]) Promise.any([p1,p2,....]) Promise.allSettled([p1,p2,....]) Generator Generator是ES6提供的一种…

云计算与大数据——MPI集群配置

什么是MPI集群&#xff1f; MPI&#xff08;消息传递接口&#xff09;是一种用于编写并行程序的标准&#xff0c;它允许在多个计算节点上进行通信和协作。MPI集群配置是指在一个或多个计算节点上设置MPI环境以实现并行计算。 MPI集群配置的步骤&#xff1a; 硬件选型&#x…

C++--day3(内联函数、结构体、类、封装、this、构造函数、析构函数)

#include <iostream>using namespace std;class My_stack { private:int *ptr; //指向堆区空间int top; //记录栈顶元素int size; public://有参构造My_stack(int size):ptr(new int[size]),top(-1){this->sizesize;cout<<"My_stack::有参构造&…

Django MultiValueDictKeyError 表单数据用request.POST 非表单数据用request.body

表单数据&#xff1a;Content-Type(请求头)为application/x-www-form-urlencoded的数据。 用request.POST获取 a request.POST.get(a) a request.POST[a] alist request.POST.getlist(a) 非表单数据&#xff1a;Content-Type(请求头)为非application/x-www-form-urlenco…

2023年郑州/杭州/深圳CSPM-3中级国标项目管理认证招生

CSPM-3中级项目管理专业人员认证&#xff0c;是中国标准化协会&#xff08;全国项目管理标准化技术委员会秘书处&#xff09;&#xff0c;面向社会开展项目管理专业人员能力的等级证书。旨在构建多层次从业人员培养培训体系&#xff0c;建立健全人才职业能力评价和激励机制的要…

【动态内存错误详解和C的内存分区】

常见的动态内存错误 1.动态内存错误2.经典案例分析2.1案例一2.1.1**问题分析**2.1.2**修改错误** 2.2案例二2.2.1 原因分析2.2.2 解决问题 c/c内存分布1.2 内存分区简介1.2.1 栈区(stack)1.2.2 堆区(heap)1.2.3 全局(静态)区1.2.4 常量区1.2.5 代码区 1.动态内存错误 &#xf…

Argo CD 入门扫盲使用

目录 一、什么是 argo cd 二、为什么使用 argo cd 三、argo cd 架构图 四、Argo CD 使用 1、安装 Argo CD 2、安装 Argo CD CLI 3、发布 Argo CD 服务 4、获取 Argo CD 密码 5、准备 Git 仓库 6、创建 Argo CD App 7、版本升级 8、版本回滚 一、什么是 argo cd A…

STM32学习笔记(十三)丨USART通用同步/异步收发器(串口外设的基本使用丨串口发送数据、串口发送+接收数据)

本篇文章包含的内容 一、STM32的USART外设1.1 STM32的USAER外设简介1.2 USART外设的结构和工作原理1.3 串口通信数据帧1.4 起始位侦测和USART的噪声判断机制1.5 波特率发生器 二、串口发送和接收数据包2.1 HEX数据包2.2 文本数据包2.3 固定包长HEX数据包接收2.4 可变包长文本数…

简单认识MySQL数据库日志和数据的备份恢复

文章目录 Mysql 备份与还原一、数据备份的重要性二、数据库备份类型1 、物理备份2 、逻辑备份 三、常见的备份方法1、 物理冷备2、 专用备份工具 mysqldump 或 mysqlhotcopy3、 启用二进制日志进行增量备份3.4 第三方工具备份 四、MySQL完全备份1、简介2、优点&#xff1a;3、缺…

SAP ABAP 报表程序实现下载文件及上传 Excel 并解析

步骤1&#xff1a; 事务代码 SMW0 选择二进制数据选项点击上方按钮。 点击新建按钮输入名称和描述&#xff0c;上传模版文件。 案例传入 EXCEL 如下&#xff1a; 创建好资源库对象结果如下。 步骤2&#xff1a;报表效果展示 点击按钮选择上传的文件。 解析 Excel 文件结果…

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

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

创建型模式 - 建造者模式

概述 将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 分离了部件的构造(由Builder来负责)和装配(由Director负责)。 从而可以构造出复杂的对象。这个模式适用于&#xff1a;某个对象的构建过程复杂的情况。 由于实现了构建和装配的解耦。…