c++之迭代器与反向迭代器

  • 正向迭代器
    • 迭代器的变量与typedef与模版
    • operator++()
    • operator--()
    • operator*()
    • operator->()
  • 反向迭代器
    • 模版与typedef与变量
    • operator++()
    • operator--()
    • operator*()
    • operator->()

正向迭代器

链表的迭代器为例
具体的代码以及可以看上一篇链表的文章:链表

迭代器的变量与typedef与模版

这例typedef是因为不想写太长
T代表类型
Ref 可以设置const与非const的迭代器
Ptr是传过来的其他类

template<class T,class Ref,class Ptr>
struct __list__iterator
{
typedef listNode<T> Node;
typedef __list__iterator<T,Ref,Ptr> self;
Node* _node;
};

operator++()

因为迭代器是需要支持++遍历的所以要重载operator++()
不同的编译器都可能不太一样

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

operator–()

同时也要支持倒着遍历

self& operator--()
{_node= _node->_prev;return *this;}
self& operator--(int)
{self tmp(*this);_node = _node->_prev;return tmp;
}

operator*()

解引用找其对应的内容

Ref operator*()
{return _node->date;
}

operator->()

这个是为了如果传过来的是类,可以访问其类里面的内容

Ptr operator->()
{return &_node->date;
}

反向迭代器

反向迭代器因为和迭代器的代码太统一了,所以前辈们把反向迭代器进行了封装
让其可以用于所有的反向迭代器,这样子所有的容器的可以用这个统一的反向迭代器

模版与typedef与变量

Iterator是传过来的类的正向迭代器
Ref是判断const还是非const
Prt是传过来的其他类
为什么是传迭代器过来呢
因为每个迭代器实现都不一样他要用不同的迭代器
进行统一操作只能回调迭代器里面的东西

template<class Iterator,class Ref,class Prt>
struct Reverselterator
{typedef Reverselterator<Iterator, Ref,Prt> Self;Iterator cur;
};

operator++()

因为是反向迭代器所以++就是往前走

Self& operator++()
{--cur;return *this;
}

operator–()

反向迭代器–是往后走

Self& operator--()
{++cur;return *this;
}

operator*()

因为我设置的end在链表中是哨兵位所以要往返回其上一位的节点
找到上一个位置返回

Ref operator*()
{//找到上一个位置的值返回Iterator tmp = cur;--tmp;return *tmp;
}

operator->()

operator()是*tmp引用返回就是返回他的指针的别名然后再->其内容*
因为->->不好看所以前辈们做的特殊处理

Prt operator->()
{return &(operator*());
}

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

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

相关文章

Vue3 快速上手从0到1,两小时学会【附源码】

小伙伴们好&#xff0c;欢迎关注&#xff0c;一起学习&#xff0c;无限进步 以下内容为vue3的学习笔记 项目需要使用到的依赖 npm install axios npm install nanoid vue-router npm install pinia npm install mitt 源码&#xff1a;Gitee 运行 npm install npm run dev需要运…

FastAPI静态文件映射到网页

安装了FastAPI 和 Uvicorn&#xff1a;pip install fastapi uvicorn 然后运行代码 from fastapi import FastAPI from fastapi.staticfiles import StaticFilesapp FastAPI()# 假设 dir_upload 为 "/Users/yourusername/yourprojectpath/files/" dir_upload &quo…

大唐杯学习笔记:Day10

1.1 5G网络基本架构-SA 基站 gNB可支持FDD模式,TDD模式或双模式操作&#xff1b; gNB可以通过Xn接口互联&#xff1b; gNB内部CU分为控制面和用户面分离架构&#xff1b; gNB可以由gNB-CU和一个或多个gNB-DU组成&#xff1b; gNB-CU和gNB-DU通过F1接口连接&#xff1b; …

每日OJ题_链表④_力扣23. 合并 K 个升序链表(小根堆_归并)

目录 力扣23. 合并 K 个升序链表 解析代码1&#xff08;小根堆优化&#xff09; 解析代码2&#xff08;递归_归并&#xff09; 力扣23. 合并 K 个升序链表 23. 合并 K 个升序链表 难度 困难 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并…

MacBook2024苹果免费mac电脑清理垃圾软件CleanMyMac X

CleanMyMac X是一款专业的Mac清理软件&#xff0c;具备多种强大功能。首先&#xff0c;它能够智能清理Mac磁盘上的垃圾文件和多余语言安装包&#xff0c;从而快速释放电脑内存。其次&#xff0c;CleanMyMac X可以轻松管理和升级Mac上的应用&#xff0c;同时强力卸载恶意软件并修…

windows使用pyenv

1、前言 虽然anaconda比pyenv相比有更好的python安装体验&#xff0c;但是有一个比较严重的问题的就是&#xff0c;他的python版本跨度不够大&#xff0c;一些老一些的项目的python版本找不到&#xff0c;比如py12306要求的python版本是3.6&#xff0c;在anaconda却找不到这个版…

Alibaba Cloud Linux 3.2104 LTS 64位 怎么安装python3.10.12和pip3.10

目录 Linux 安装python3.10.12 Linux 安装python3.10.12 报错解决 Linux 安装python3.10.12 问题描述&#xff1a;Alibaba Cloud Linux 3.2104 LTS 64位 安装python3.10.12和pip3.10&#xff0c;本人按照网上普通几种安装方式虽然能安装上了&#xff0c;但是它与pip版本不一…

查看pip当前关联python版本及位置

好久没用python了&#xff0c;把各种pip指向的环境忘光光啦&#xff0c;这里记录一下查看pip当前关联的python版本及位置的方法&#xff1a; pip -V结果&#xff1a; 我一般不用这个版本的python&#xff0c;去环境变量看了一下&#xff0c;原来是anaconda的Scripts自带pip&a…

gprof安装使用(CMake)说明

一、安装 1、gprof默认已安装&#xff0c;可安装相关图形处理 sudo apt-get install python graphviz sudo pip install gprof2dot 注意&#xff1a;在Debian中没有安装成功&#xff0c;报Python的版本不匹配 二、使用说明 1、使用CMake管理的工程&#xff1a; 重新配置CMa…

记录一次以WEB API方式为sonar扫描问题分配责任人的自杀式袭击

前提背景&#xff1a;获取android代码中我们修改的所有文件扫描&#xff0c;忽略基线原生未修改的文件也忽略了git&#xff0c;这导致扫描的问题没有办法分配责任人。 一开始想到了api分配的方式&#xff0c;于是动手操作了起来&#xff08;忽略了问题太多&#xff09;&#x…

Elastic Stack--05--聚合、映射mapping

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.聚合(aggregations)基本概念桶&#xff08;bucket&#xff09;度量&#xff08;metrics&#xff09; 案例 11. 接下来按price字段进行分组&#xff1a;2. 若想对所…

LVS集群 ----------------(直接路由 )DR模式部署 (二)

一、LVS集群的三种工作模式 lvs-nat&#xff1a;修改请求报文的目标IP,多目标IP的DNAT lvs-dr&#xff1a;操纵封装新的MAC地址&#xff08;直接路由&#xff09; lvs-tun&#xff1a;隧道模式 lvs-dr 是 LVS集群的 默认工作模式 NAT通过网络地址转换实现的虚拟服务器&…

在Linux系统中安装Conda

在Linux系统中安装Conda&#xff08;通常指的是安装Miniconda或Anaconda&#xff09;可以通过以下步骤完成&#xff1a; 安装Miniconda&#xff1a; 下载Miniconda安装脚本&#xff1a; 打开终端&#xff0c;并使用wget或curl命令下载Miniconda的安装脚本。以下是使用wget的示…

(delphi11最新学习资料) Object Pascal 学习笔记---第6章第5节( 其他字符串类型 )

6.5 其他字符串类型 ​ 虽然字符串数据类型是迄今为止最常见、最常用的字符串表示类型&#xff0c;但 Object Pascal 桌面编译器过去和现在都有多种字符串类型。其中一些类型还可用于移动应用程序&#xff0c;在移动应用程序中&#xff0c;您也可以直接使用 TBytes 来操作单字…

2024年【电工(初级)】考试内容及电工(初级)考试报名

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 电工&#xff08;初级&#xff09;考试内容根据新电工&#xff08;初级&#xff09;考试大纲要求&#xff0c;安全生产模拟考试一点通将电工&#xff08;初级&#xff09;模拟考试试题进行汇编&#xff0c;组成一套电…

Gitlab修改仓库权限为public、Internal、Private

Public&#xff08;公开&#xff09;&#xff1a;所有人都可以访问该仓库&#xff1b; Internal&#xff08;内部&#xff09;&#xff1a;同一个GitLab群组或实例内的所有用户都可以访问该仓库&#xff1b; Private&#xff08;私人&#xff09;&#xff1a;仅包括指定成员的用…

2024 年广东省职业院校技能大赛(高职组) “云计算应用”赛项样题②

2024 年广东省职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项样题② 模块一 私有云&#xff08;50 分&#xff09;任务 1 私有云服务搭建&#xff08;10 分&#xff09;任务 2 私有云服务运维&#xff08;25 分&#xff09;任务 3 私有云运维开发&#xf…

odoo的create, wirte, update 的作用

在Odoo的开发过程中&#xff0c;主要会使用到create、write和update这几个方法来操作数据库中的记录。 create方法: create方法用于创建新的记录。当用户在Odoo的前端界面上填写表单并提交时&#xff0c;相应的Odoo模型&#xff08;Model&#xff09;会调用create方法。该方法接…

突破编程_前端_JS编程实例(目录导航)

1 开发目标 目录导航组件旨在提供一个滚动目录导航功能&#xff0c;使得用户可以方便地通过点击目录条目快速定位到对应的内容标题位置&#xff0c;同时也能够随着滚动条的移动动态显示当前位置在目录中的位置&#xff1a; 2 详细需求 2.1 标题提取与目录生成 组件需要能够自…

虚拟机实验环境配置与使用(计算机系统2)

一、 实验目标&#xff1a; 熟悉Linux上C程序的编译和调试工具&#xff0c;包括以下内容&#xff1a; 1. 了解Linux操作系统及其常用命令 2. 掌握编译工具gcc的基本用法 3. 掌握使用gdb进行程序调试 二、实验环境与工件 1.个人电脑 2. Fedora 13 Linux 操作系统 3. gcc…