C++从零开始的打怪升级之路(day32)

这是关于一个普通双非本科大一学生的C++的学习记录贴

在此前,我学了一点点C语言还有简单的数据结构,如果有小伙伴想和我一起学习的,可以私信我交流分享学习资料

那么开启正题

今天分享的是关于list的模拟实现,今天只实现一部分基础函数,重点是const迭代器

1.iterator的访问

由于访问方式的不同,iterator的类实现*的重载同时还应该实现->的重载

T& operator*()
{return _node->_data;
}T* operator->()
{return &_node->_data;
}

 2.自定义类型相关

当list中存储的是自定义类型时,我们来看下面的代码

struct Date
{int _year;int _month;int _day;Date(int year = 0,int month = 1,int day = 1):_year(year),_month(month),_day(day){}
};void Test_list2()
{list<Date> l;l.push_back(Date(2006,9,12));l.push_back(Date(1999,5,6));list<Date>::iterator it = l.begin();while(it != l.end()){cout << it->_year << "-" << it->_month << "-" << it->_day << endl;++it;}
} 

很明显如果要通过it访问_year(或_month,_day)应该是it->->_year

第一次->通过it访问到Date,第二次->通过Date再访问到_year

而我们要写出上面说的代码,是不能编译通过的(vs环境下),而写一次->可以编译通过,这是因为为了增强代码的可读性,编译器在这里特殊处理了,不需要我们写两次,一次即可

3.const迭代器

实际运用中我们难免遇到const迭代器的存在

const迭代器是const对象的迭代器,实际运用中,我们不会自己创建const对象,因为没有实际意义,而在一些函数调用中难免出现const修饰的情况,这个时候const迭代器的存在就不可或缺了

对于const与非const的存在,我们需要对模板进行一些改造

typedef __list_iterator<T, T&, T*> iterator;
typedef __list_iterator<T, const T&, const T*> const_iterator;

 对应的有下面这些迭代器相关函数

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

下面是完整的代码,以及测试代码

#include<iostream>
#include<list>using namespace std;namespace wkl
{template<class T>struct __list_node{__list_node* _next;__list_node* _prev;T _data;__list_node(const T& x = T()):_next(nullptr),_prev(nullptr),_data(x){}};// T  T&  T*template<class T, class Ref, class Ptr>struct __list_iterator{typedef __list_node<T> Node;typedef __list_iterator<T, Ref, Ptr> Self;Node* _node;__list_iterator(Node* node = nullptr):_node(node){}Ref operator*(){return _node->_data;}Ptr operator->(){return &_node->_data;}Self& operator++(){_node = _node->_next;return *this;}Self operator++(int){Self tmp(*this);_node = _node->_next;return tmp;}Self& operator--(){_node = _node->_prev;return *this;}Self operator--(int){Self tmp(*this);_node = _node->_prev;return tmp;}bool operator!=(const Self& it) const {return _node != it._node;}bool operator==(const Self& it) const {return _node == it._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;list(){_head = new Node;_head->_next = nullptr;_head->_prev = nullptr;}~list(){clear();delete[] _head;_head = nullptr;}void clear(){iterator it = begin();while (it != end()){erase(it++);}}iterator begin(){return iterator(_head->_next);}iterator end(){return iterator(_head);}const_iterator begin() const{return const_iterator(_head->next);}const_iterator end() const{return const_iterator(_head);}void push_back(const T& x){Node* tail = _head->_prev;Node* newnode = new Node(x);newnode->_next = _head;newnode->_prev = tail;tail->_next = newnode;_head->_prev = newnode;}private:Node* _head;};};void Test_list1(){list<int> l;l.push_back(1);l.push_back(2);l.push_back(3);l.push_back(4);list<int>::iterator it = l.begin();while (it != l.end()){cout << *it << " ";++it;}cout << endl;}struct Date{int _year;int _month;int _day;Date(int year = 0,int month = 1,int day = 1):_year(year),_month(month),_day(day){}};void Test_list2(){list<Date> l;l.push_back(Date(2006,9,12));l.push_back(Date(1999,5,6));list<Date>::iterator it = l.begin();while(it != l.end()){cout << it->_year << "-" << it->_month << "-" << it->_day << endl;++it;}} void list_print(const list<int>& l){list<int>::const_iterator it = l.begin();while (it != l.end()){//*it = 1;cout << *it << " ";++it;}cout << endl;}void Test_list3(){list<int> l;l.push_back(1);l.push_back(2);l.push_back(3);l.push_back(4);l.push_back(5);list_print(l);}
}int main()
{wkl::Test_list3();return 0;
}

新手写博客,有不对的位置希望大佬们能够指出,也谢谢大家能看到这里,让我们一起学习进步吧!! 

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

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

相关文章

高清符合要求的SCI图片使用RStudio导出

4.图片格式区别和常识 在计算机中&#xff0c;JPEG&#xff08;发音为jay-peg, IPA&#xff1a;[ˈdʒeɪpɛg]&#xff09;是一种针对照片视频而广泛使用的有损压缩标准方法。这个名称代表Joint Photographic Experts Group&#xff08;联合图像专家小组&#xff09;。此团队创…

微信小程序学习指南:从基础知识到代码展示

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

Qt 常见容器类用法(一)

目录 QMap类 QHash类 QVector类 QMap类 QMap<key,T>提供一个从类型为Key的键到类型为T的值的映射。通常&#xff0c;QMap存储的数据形式是一个键对应一个值&#xff0c;并且按照键Key的次序存储数据。为了能够支持一键多值的情况&#xff0c;QMap提供QMap<key,T&g…

0206作业

TCP&#xff08;传输控制协议&#xff09;和 UDP&#xff08;用户数据报协议&#xff09;是两种常用的网络传输协议。它们之间的主要区别在于&#xff1a; 可靠性&#xff1a;TCP 是一种可靠的传输协议&#xff0c;它提供了数据传输的确认、重传和排序功能。如果数据在传输过程…

假期day4,链表增加与删除(2024/2/5)

单链表头插增加 Linklist insert_head(datatype element,Linklist head) {//创建新节点 Linklist screate_node();if(NULLs)return head; s->dataelement;//1,判断链表为空if(NULLhead){heads;}else //链表不为空{s->nexthead;heads;}return head; }单链表头删除 Linkl…

Bug地狱 #1 突然宕机,企业级应用到底怎么了

Bug地狱 #1 突然宕机&#xff0c;企业级应用到底怎么了 背景 目前就职的企业经营是一家服务小微门店Saas企业&#xff0c;以进销存管理和客户营销为主体提供订阅服务。项目正式上线可以说是从13年&#xff0c;基础架构是Web和后端使用C# .net&#xff0c;数据库使用SQL Serve…

分享76个节日PPT,总有一款适合您

分享76个节日PPT&#xff0c;总有一款适合您 76个节日PPT下载链接&#xff1a;https://pan.baidu.com/s/1-j7toLaBUBAJbkd85xe4VQ?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易…

C#验证字符串是否大写、小写,正则表达式vs用Char.IsUpper和Char.IsLower方法遍历字符数组

目录 一、使用的方法 1.正则表达式 2.用Char.IsUpper或Char.IsLower方法 二、源代码 1.源码 2.生成效果 一、使用的方法 1.正则表达式 正则表达式“^[A-Z]$”&#xff0c;其中[A-Z]表示匹配一个到多个大写字母。 正则表达式“^[a-z]$”&#xff0c;其中[a-z]表示匹配一个…

谈一谈深度学习与机器学习

深度学习是机器学习的一个子领域&#xff0c;其核心是使用多层神经网络来学习数据的复杂表示。机器学习是一种更广泛的概念&#xff0c;涵盖了许多不同的方法和技术&#xff0c;包括深度学习在内。 关系&#xff1a; 深度学习是机器学习的一种方法&#xff1a;深度学习利用多…

EasyExcel下载带下拉框和批注模板

EasyExcel下载带下拉框和批注模板 一、 代码实现 controller下载入口 /***下载excel模板* author youlu* date 2023/8/14 17:31* param response* param request* return void*/PostMapping("/downloadTemplate")public void downloadExcel(HttpServletResponse r…

Mysql-数据库优化-客户端连接参数

客户端参数 原文地址 # 连接池配置 # 初始化连接数 spring.datasource.druid.initial-size1 # 最小空闲连接数&#xff0c;一般设置和initial-size一致 spring.datasource.druid.min-idle1 # 最大活动连接数&#xff0c;一个数据库能够支撑最大的连接数是多少呢&#xff1f; …

Vue中的请求拦截器

目录 1 前言 2 使用方法 2.1 创建拦截器 2.2 引入拦截器 1 前言 我们常常会使用JWT令牌来验证登录&#xff0c;因此很多请求都需要携带JWT令牌&#xff0c;我们当然可以用{headers:{Authorization:xx}}的方式&#xff0c;向每个请求中都以这样的方式添加JWT令牌。不过这样…

同样的代码,开发环境生效,测试环境不生效,记一次问题排查过程和原因分析

我的公众号:IT周瑜 今天有同事遇到这样一个问题,有一个新增接口在本地和开发环境的swagger上都能看到,但是在测试环境的swagger上却看不到,并且确定测试环境是最新的代码,并重新构建和部署了。 按照同事的描述,首先我得确定是不是swagger的问题,我先检查我们平台组是否…

javaEE - 23( 21000 字 Servlet 入门 -1 )

一&#xff1a;Servlet 1.1 Servlet 是什么 Servlet 是一种实现动态页面的技术. 是一组 Tomcat 提供给程序猿的 API, 帮助程序猿简单高效的开发一个 web app. 构建动态页面的技术有很多, 每种语言都有一些相关的库/框架来做这件事&#xff0c;Servlet 就是 Tomcat 这个 HTTP…

[第五天】C++继承:单继承、多继承、菱形继承和虚继承的深度解析

一、单继承 1、概述 C最重要的特征是代码重用&#xff0c;通过继承机制可以利用已有的数据类型来定义新的数据类型&#xff0c;新的类不仅拥有旧类的成员&#xff0c;还拥有新定义的成员。 例如一个B类继承于A类&#xff0c;或称从类A派生类B。这样的话&#xff0c;类A成为基类…

2月06日,每日信息差

第一、建业地产有40个项目入围“白名单”&#xff0c;项目分布在郑州、信阳、焦作、洛阳等城市。接近建业地产人士表示&#xff0c;因各城市项目申报、审批工作进度不同&#xff0c;各城市项目的“白名单”申报工作还在持续进行&#xff0c;相关审批通过后&#xff0c;公司入围…

零基础学Python之面向对象

1.面向对象编程简介 &#xff08;1&#xff09;什么是面向对象 面向对象程序设计(Object Oriented Programming)作为一种新方法&#xff0c;其本质是以建立模型体现出来的抽象思维过程和面向对象的方法。模型是用来反映现实世界中事物特征的。任何一个模型都不可能反映客观事…

StarRocks 1 月社区动态(2024)

StarRocks 在 2023 年不断进化&#xff0c;锤炼核心功能&#xff0c;打磨全新特性&#xff0c;成功实现了从全场景 OLAP 到云原生湖仓的全面升级&#xff0c;成为湖仓新范式的造浪者。2024 年&#xff0c;我们期待与您一同续写新篇章&#xff0c;共同迈向“极速统一”的新征程&…

使用#if 和 #endif 实现注释,及原因

注释我们代码中经常使用&#xff0c; 单行注释和多行注释我们都会经常用到。 但是有些场景下这两种注释并不是很方便&#xff0c;这样我们就可以使用上面的两个宏来对代码进行注释。 什么情况下使用那两种注释不方便? 1. 如果代码很多时&#xff0c;我们如果一行一行…

【Qt】常见问题

1.存在未解析的标识符 将build文件夹删掉重新编译。 2.左侧项目目录栏无法删除已添加项目 打开目标项目上一级的pro文件&#xff0c;将目标文件名字注释或者删除掉&#xff0c;最后保存&#xff0c;qt就会自动更新&#xff0c;将该项目隐藏掉。 3.在qt creator下添加槽函数…