迭代器的封装与反向迭代器

一、反向迭代器

在list模拟实现的过程中,第一次接触了迭代器的封装,将list的指针封装成了一个新的类型,并且以迭代器的基本功能对其进行了运算符重载

反向迭代器是对正向迭代器的封装,并且体现了泛型编程的思想,任意类型的双向迭代器都可以直接复用反向迭代器

本章将把两个迭代器的实现放在一起比对,更好的体会迭代器的封装

二、list正向迭代器的模拟实现

详解可以看list模拟实现那一章节,这里仅提供一份代码用于对照反向迭代器

cpp 复制代码
	template<class T,class Ref,class Ptr>
	struct __list_iterator
	{
		typedef list_node<T> node;
		typedef __list_iterator<T, Ref, Ptr> self;
		node* _pnode;

		__list_iterator(node* p)
			:_pnode(p)
		{}

		self& operator++()
		{
			_pnode = _pnode->_next;
			return *this;
		}
		self& operator--()
		{
			_pnode = _pnode->_prev;
			return *this;
		}
		self operator++(int)
		{
			self tmp(_pnode);
			_pnode = _pnode->_next;
			return tmp;
		}
		self operator--(int)
		{
			self tmp(_pnode);
			_pnode = _pnode->_prev;
			return tmp;
		}
		Ref operator*()
		{
			return _pnode->_data;
		}
		Ptr operator->()
		{
			return &(_pnode->_data);
		}
		bool operator!=(const self& p)
		{
			return _pnode != p._pnode;
		}
		bool operator==(const self& p)
		{
			return _pnode == p._pnode;
		}
	};

三、反向迭代器的封装实现(双向迭代器)

反向迭代器的实现是对正向迭代器的封装

1.成员及其初始化

cpp 复制代码
template<class Iterator,class Ref,class Ptr>
struct ReserveIterator
{
    typedef ReserveIterator self;//重命名方便使用
    Iterator _it;//成员变量
        
    ReserveIterator(Iterator it)
    :_it(it)
    {}
}

2.基本功能的重载

(1) ++ 和 --

在反向迭代器的概念中,反向迭代器++,就是正向迭代器--

cpp 复制代码
self& operator++()
{
    _it--;
    return *this;
}
self& operator--()
{
    _it++;
    return *this;
}
//前置++和--
self operator++(int)
{
    self tmp(*this);
    _it--;
    return tmp;
}
self operator--(int)
{
    self tmp(*this);
    _it++;
    return tmp;
}

(2) != 和 ==

cpp 复制代码
bool operator!=(const self& s)
{
    return _it != s._it;
}
bool operator==(const self& s)
{
    return _it == s._it;
}

(3) -> 和 *

在实现operator*()之前,要先理解底层,在stl库内的实现,为了让begin()和rend(),所在的物理空间上对称,但在使用的角度上来看,并不对称,为了使其对称,且不影响使用,对*和->的实现作出了调整,解引用返回的是其前一个的位置

cpp 复制代码
Ref operator*()
{
    Iterator tmp(_it);
    _it--;
    return *tmp; 
}
Ptr operator->()
{
    Iterator tmp(_it);
    _it--;
    return &(*_it);
}

3.定义部分

cpp 复制代码
		typedef __list_iterator<T, T&, T*> iterator;
		typedef __list_iterator<T, const T&, const T*> con_iterator;
		typedef ReverseIterator<iterator, T&, T*> reverse_iterator;
		typedef ReverseIterator<iterator,const T&,const T*> con_reverse_iterator;

		iterator begin()
		{
			return iterator(_head->_next);
		}
		iterator end()
		{
			return iterator(_head);
		}
		con_iterator begin()const
		{
			return con_iterator(_head->_next);
		}
		con_iterator end()const
		{
			return con_iterator(_head);
		}
		reverse_iterator rbegin()
		{
			return reverse_iterator(end());
		}
		reverse_iterator rend()
		{
			return reverse_iterator(begin());
		}

总结

本章整理了关于反向迭代器的相关内容,以及模拟实现

相关推荐
云梦谭24 分钟前
让 Linux 主动连接 Windows:配置 Windows 11 SSH 服务端
linux·windows·ssh
奇树谦33 分钟前
Windows CMD 下 mc 运维指南:SeaweedFS 安装验收与 MinIO 数据迁移
运维·windows
keren25 小时前
SceneDock:Windows 场景化工作台——一键启动工作链,还能被 AI Agent 调用(CLI / MCP)
windows·开发工具·效率工具·mcp
成旭先生7 小时前
车辆、能源与地理数据 API 实战:把定价、油价、行政区划串成一条链路
人工智能·windows·能源·api集成·油价查询·车辆定价·地址清洗
seahahacsdn8 小时前
Windows获取SYSTEM用户权限的方法应用-计划任务
windows
上海云盾-小余9 小时前
七层 CC 攻击检测难点:如何区分真实用户与攻击请求
网络·人工智能·windows·tcp/ip·udp
2501_915106329 小时前
Windows 上开发 Unity iOS,使用 KXBuild 进行真机调试、性能采样与打包 ipa
windows·vscode·unity·ios·个人开发·swift·敏捷流程
西柚不烦恼9 小时前
Windows 本地部署私有 AI 全攻略:纯 CPU 环境(Ollama + Open WebUI)
人工智能·windows
少年的范儿9 小时前
Windows 安装 Node.js 教程:nvm 版本管理 + pnpm 安装配置
windows·npm·node.js
bu_shuo12 小时前
删除Windows资源管理器左侧【此电脑】的Linux企鹅图标
linux·windows